为什么在c linux中尝试使用共享内存的IPC时出现分段错误



问题:在3个进程之间实现IPC,第一个进程创建共享内存,然后向第二个和第三个进程发送信号,以便它们可以连接到共享内存,现在让第二个进程向共享内存写入一些内容,然后让它向第三个进程发送一个信号,以便第三个处理读取第二个处理所写的内容。

我的代码:

#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 
#include <unistd.h> 
static int pid0, pid1, pid2, shmid, status;
struct memory { 
char msg[100];
}; 
struct memory* shmptr; 
struct sigaction act0, act1, act2;
// Handler For P0
void handler0(int signum) 
{ 
if (signum == SIGUSR1) { 
printf("Allowing P1 And P2 To Get Attachednn");
kill(pid1, SIGUSR1); // Allow P1 To Get Attached
kill(pid2, SIGUSR1); // Allow P2 To Get Attached
} 
if (signum == SIGUSR2) { 
kill(pid1, SIGINT); // Kill P1 
kill(pid2, SIGINT); // Kill P2 
} 
} 
// Handler For P1
void handler1(int signum) 
{ 
if (signum == SIGUSR1) { 

// Attaching To The Shared Memory 
shmptr = (struct memory*) shmat(shmid, 0, 0); 
printf("P1 - Attached to: %dnn", shmid); 
} 
} 
// Handler For P2
void handler2(int signum) 
{ 
if (signum == SIGUSR1) { 

// Attaching To The Shared Memory 
shmptr = (struct memory*) shmat(shmid, 0, 0); 
printf("P2 - Attached to: %dnn", shmid); 
} 
if (signum == SIGUSR2) { 
printf("Message Read From Shared Memory Is: "); 
puts(shmptr->msg); 
status = 1;
// Detaching P2 From The Shared Memory
shmdt((void*)shmptr);

kill(pid0, SIGUSR2);
}
} 
int main() 
{
status = 0;
printf("P0nn");
pid0 = getpid();
// Key Of Shared Memory 
key_t key = 123456;
// Shared Memory Creation
printf("Creating Shared Memorynn"); 
shmid = shmget(key, sizeof(struct memory), IPC_CREAT | 0666); 
// Attaching P0 To The Shared Memory 
shmptr = (struct memory*)shmat(shmid, 0, 0); 
printf("P0 - Attached to: %dnn", shmid);
// Attaching Handler Function To Signal SIGUSR1 For Process 0
act0.sa_handler = handler0;
sigaction(SIGUSR1, &act0, NULL);
printf("Forking...nn");

pid1 = vfork();
if(pid1 == 0){ // Inside P1
printf("P1nn");

// Attaching Handler Function To Signal SIGUSR1 For Process 1
act1.sa_handler = handler1;
sigaction(SIGUSR1, &act1, NULL);
pid2 = vfork();
if(pid2 == 0){ // Inside P2
printf("P2nn");
// Attaching Handler Functions To Signals SIGUSR1 And SIGUSR2 For Process 2
act2.sa_handler = handler2;
sigaction(SIGUSR1, &act2, NULL);
sigaction(SIGUSR2, &act2, NULL);
kill(pid0, SIGUSR1); // Tell P0 That P1 And P2 Are Ready To Get Attached To The Shared Memory

} else { // Inside P1
printf("P1 Againnn");
// Writing A Message To The Shared Memory
printf("Enter A Message: n");
fgets(shmptr->msg, 100, stdin); 
// Sending The Message To Process 2
kill(pid2, SIGUSR2); 
printf("Sent Message To P2nn"); // this gets printed and then a segmentation fault error occurs
}
} else { // Inside P0

printf("P0 - Waiting..nn");
while(1){
if(status == 1)
break;
}
// Detaching P0 From The Shared Memory
shmdt((void*)shmptr);
shmctl(shmid, IPC_RMID, (struct shmid_ds *) NULL);
}
}

在执行printf("Sent Message To P2nn");之后,我得到分段故障错误

请告诉我为什么,我搞不清

感谢

使用vfork()无法做到这一点。

阅读手册页,尤其是顶部附近写着的部分

如果由vfork((修改pid_t类型变量以外的任何数据用于存储vfork((的返回值,或从调用vfork((的函数,或调用任何其他函数在成功调用_exit(2(或的exec(3(家族之一之前功能。

最新更新