【发布时间】:2016-11-09 00:31:38
【问题描述】:
嗨,我在这里要做的是一个程序,它首先在文件 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();
}
}
【问题讨论】:
-
IIRC 信号处理程序在被调用时未设置,这意味着它需要重新设置自己。
-
很抱歉,不是所有 3 个信号处理程序都应该在 main 之前定义吗?我的意思是第一次(对于信号 SIGINT)父母完美地工作,问题是第二次。
-
哈!而且,刚刚注意到您命名为
son的变量实际上是父变量!你的名字让我很困惑。 -
@j.DOH 我刚才所说的与他们在程序中定义的顺序无关。