简体   繁体   中英

Linux Shared Memory Segmentation Fault

I am learning about shared memory and have created this sample program to test things out

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

However when I run it, I get segmentation fault. It seems that my pointers to the shared memory are not right. Also nothing is getting printed from the indefinite while loop in the child process.

ankit@ankit-ThinkPad-W530:~/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)

What is going wrong here?

I'm not sure why you are including those last three header files. They are not the right headers and will give you the wrong definition of the shm functions. On my system gcc will even produce a warning which gives some clue that there is a problem:

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

Instead, you should include only the ones specified in the shmat man page . Specifically:

#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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM