2016-07-15 37 views
3

ich über Shared Memory lerne und haben dieses Beispielprogramm erstellt Dinge zu testenLinux Shared Memory Segmentation Fault

//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); 
} 

Allerdings, wenn ich es laufen, ich Segmentierungsfehler bekommen. Es scheint, dass meine Zeiger auf den geteilten Speicher nicht richtig sind. Außerdem wird nichts aus der unbestimmten while-Schleife im untergeordneten Prozess gedruckt.

[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) 

Was läuft hier falsch?

Antwort

6

Ich bin mir nicht sicher, warum Sie diese letzten drei Header-Dateien enthalten. Sie sind nicht die richtigen Header und geben Ihnen die falsche Definition der SHM-Funktionen. Auf meinem System gcc wird auch eine Warnung erzeugen, die einen Hinweis gibt, dass es ein Problem gibt:

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); 

Stattdessen sollten Sie nur die, die in den shmat man page angegeben sind. Genauer gesagt:

#include<stdio.h> 
#include<stdlib.h> 

// Remove these headers 
//#include<linux/ipc.h> 
//#include<linux/msg.h> 
//#include<linux/shm.h> 

// Include these instead 
#include <sys/types.h> 
#include <sys/shm.h> 
+0

danke für das hinweisend. Ich war auch dadurch verwirrt. aber das Tutorial, dem ich folgte, beinhaltete die Linux-Einsen, also ging ich mit denen. Was genau ist der Unterschied zwischen den beiden? – Ankit

+0

Ich weiß nicht genau, was diese Header sind. Sie sehen wie Header aus, die intern im Kernel und in der Bibliothek verwendet werden. – kaylum

+0

einschließlich der genannten Header, beseitigt die Warnungen, aber Segmentierung Fehler weiterhin besteht – Ankit