2016-07-15 11 views
3

私はそれを実行したときしかし、私はセグメンテーションフォールトを取得し、共有メモリについて学んでいますし、Linuxの共有メモリセグメンテーションフォールト

//IPC - Shared Memory 

#include<stdio.h> 
#include<stdlib.h> 
#include<linux/ipc.h> 
#include<linux/msg.h> 
#include<linux/shm.h> 

int main(int argc, char* argv[]) 
{ 
    printf("setting up shared memory\n"); 

    key_t ipc_key; 
    int shmid; 
    int pid; 


    ipc_key = ftok(".",'b'); 

    if((shmid=shmget(ipc_key, 32, IPC_CREAT|0666))==-1) 
    { 
    printf("error creating shared memory\n"); 
    exit(1); 
    } 

    printf("shared memory created with id %d\n",shmid); 

    //fork a child process 
    pid = fork(); 
    printf("fork result %d\n",pid); 
    if(pid==0) 
    { 
    //child process 
    //attach the shared memory 
    int* shm_add_child = (int*)shmat(shmid, 0,0); 
    printf("child attached to shared mem at address %p\n",(void*)shm_add_child); 

    while(1) 
    { 
     printf("%d\n",*shm_add_child); 
     printf("a\n"); 
    } 

    //detach from shm 
    shmdt(shm_add_child); 
    } 
    else 
    { 
    //parent process 
    int* shm_add_parent; 

    shm_add_parent = (int*)shmat(shmid, 0,0); 
    printf("parent attached to shared mem at address %p\n",(void*)shm_add_parent); 
    *shm_add_parent = 10; 

    sleep(10); 

    //detach from shm 
    shmdt(shm_add_parent); 
    } 

    //remove shm 
    shmctl(shmid, IPC_RMID,0); 

    exit(0); 
} 

を物事をテストするには、このサンプルプログラムを作成しました。共有メモリへの私のポインタが正しくないようです。また、子プロセスの無限ループ中に何も印刷されません。

[email protected]:~/Desktop/week1_tasks$ ./ipc_sharedmem_a 
setting up shared memory 
shared memory created with id 5996570 
fork result 8703 
parent attached to shared mem at address 0xffffffff991aa000 
fork result 0 
child attached to shared mem at address 0xffffffff991aa000 
Segmentation fault (core dumped) 

ここで何が問題になりますか?

答えて

6

最後の3つのヘッダーファイルを含む理由がわかりません。それらは正しいヘッダーではなく、shm関数の間違った定義を与えるでしょう。私のシステムのgccでも、問題があることが、いくつかの手がかりを与える警告生成されます。

代わり
test.c:38:26: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 
    int* shm_add_child = (int*)shmat(shmid, 0,0); 
         ^
test.c:55:22: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 
    shm_add_parent = (int*)shmat(shmid, 0,0); 

を、あなたはshmat man pageで指定されたものだけを含める必要があります。具体的には:

+0

それを指摘してくれてありがとう。私もこれで混乱しました。しかし、私が従っていたチュートリアルには、Linuxのものが含まれていたので、私はそれらと一緒に行った。両者の違いは何ですか? – Ankit

+0

私はそれらのヘッダーが何であるか正確にはわかりません。カーネルやライブラリの内部で使用されるヘッダのように見えます。上記のヘッダーを含む – kaylum

+0

は、警告を取り除きますが、セグメント化の問題は引き続き発生します – Ankit