2016-07-15 2 views
3

Я учусь о разделяемой памяти и создал эту программу примера, чтобы проверить вещиLinux 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); 
} 

Однако, когда я запускаю его, я получаю ошибку сегментации. Кажется, что мои указатели на общую память неправильны. Также ничего не печатается из неопределенного цикла while в дочернем процессе.

[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

Я не уверен, почему вы включаете эти последние три файла заголовка. Они не являются правильными заголовками и дадут вам неправильное определение функций 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. В частности:

#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

спасибо, что указал. Я тоже был смущен этим. но учебник, который я читал, включал в себя linux, поэтому я пошел с ними. В чем же разница между этими двумя? – Ankit

+0

Я точно не знаю, что это за заголовки. Они выглядят как заголовки, которые используются внутри ядра и библиотеки. – kaylum

+0

, включая упомянутые выше заголовки, избавляется от предупреждений, но проблема с сегментацией по-прежнему сохраняется – Ankit