我是一名学生,我正在尝试理解有关Unix编程的课程中的信号。
首先,我想测试一个简单的例子:一个进程生成一个子进程并需要确认实际的创建。 我叉子,在孩子里面,我发送一个SIGUSR1给父亲 kill(getppid(),SIGUSR1); 然后,在父亲内,我写了一个暂停(); sys调用阻塞进程直到收到信号,然后我写了 (sigaction(SIGUSR1,& sa,NULL)检查。
问题是,信号被发送并且程序停止,没有处理程序执行。
我用
编译它$gcc -Wall -o test test.c
我没有收到警告,输出是
$I am the father
$I am the child
$User defined signal 1
我知道我可以通过其他方式执行此操作(使用sleep sys调用等),但我只是想了解为什么此代码不起作用。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void new_child (int sig){
write(1,"I made a new child\n",50);
}
int main(){
pid_t child;
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = new_child;
switch(child = fork()){
case -1:
printf("Error.\n");
exit(EXIT_FAILURE);
case 0:
printf("I am the child\n");
kill(getppid(), SIGUSR1);
break;
default:
printf("I am the father\n");
pause();
if (sigaction(SIGUSR1, &sa, NULL) == -1){
printf("Signal error.\n");
exit(EXIT_FAILURE);
}
printf("I'm done.");
kill (child, SIGKILL);
exit(EXIT_SUCCESS);
}
}
我知道这个问题已被提出,但我似乎无法找到适用于我的解决方案。
答案 0 :(得分:0)
您必须在代码的开头更改信号,以便在收到SIGUSR(Anjaneyulu)后立即执行。
“ 您必须在代码的开头更改信号... ”此限制有点严格。信号处理程序需要在调用fork()
之前最新安装。
–alk