我想在这里做的是一个程序,首先在文件server.lock中注册它的pid然后它应该做一个fork()。儿子应该说它开始工作而不是被动等待并装备信号SIGUSR2,当它接收它时,它应该终止它的执行并写下“再见残酷的世界”。父母应该开始写它并进行被动等待,然后设置信号SIGUSR1和SIGINT。如果它接收到SIGUSR1,它自己应该将信号SIGUSR2发送给子,如果它收到信号SIGINT,如果它是第一次收到它,它应该说它得到了信号,如果它是第二次它应该发送信号SIGUSR2到儿子,所以它终止了儿子和它的执行。现在我的问题是与父母,我不知道为什么,但第二次收到信号它说错误“用户定义信号2”并离开,如果有人可以向我解释我在做错了我会非常感谢。这是代码。谢谢。
int p = 1;
int son;
void handle_SIGINT(int signal){
if ( p==1 ) {
p = 2;
printf("The authentication module received the signal SIGINT\n");
}else{
kill( son, SIGUSR2);
exit(0);
}
}
void handle_SIGUSR1(int signal){
kill( son, SIGUSR2);
}
void handle_SIGUSR2(int signal){
printf("Goodbye cruel world\n");
exit(0);
}
void main(){
int pid = getpid();
FILE *f = fopen("server.lock", "w");
fprintf( f, "%d", pid );
fclose(f);
int n = fork();
if ( n==0 ) {
printf("The message handling module has started\n");
signal(SIGUSR2, handle_SIGUSR2);
while(1)
pause();
}else{
printf("The authentication module has started\n");
son = getpid();
signal(SIGUSR1, handle_SIGUSR1);
signal(SIGINT, handle_SIGINT);
while(1)
pause();
}
}
答案 0 :(得分:0)
你的命名使我困惑。您的问题似乎是名为son
的变量。这不是儿子又名儿童过程。这是父母。
fork
调用返回两次。一旦进入父母,一次进入孩子。在父级中,它返回子级的PID。它在孩子中返回0。你让他们逆转了!
您使用signal
代替sigaction
。我建议使用sigaction
。它要复杂得多,但也提供了更多选择。
您使用signal
时遇到的问题是,在调用处理程序后,它会将信号重置为默认行为。但这也不能保证。 GNU C库的行为有所不同,具体取决于是_BSD_SOURCE
,_GNU_SOURCE
还是没有定义。这是为了模拟它在BSD UNIX或SYSV UNIX上的表现。这就是为什么sigaction
是一个更好的选择,它在每个POSIX系统上都是一样的。