Reputation: 441
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?
Upvotes: 3
Views: 1444
Reputation: 14046
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>
Upvotes: 6