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?
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
Ich weiß nicht genau, was diese Header sind. Sie sehen wie Header aus, die intern im Kernel und in der Bibliothek verwendet werden. – kaylum
einschließlich der genannten Header, beseitigt die Warnungen, aber Segmentierung Fehler weiterhin besteht – Ankit