C 过程不';t在接收到用户定义的信号时取消暂停
我试图让两个进程在C语言中协作。为此,我使用了C 过程不';t在接收到用户定义的信号时取消暂停,c,unix,signals,fork,pause,C,Unix,Signals,Fork,Pause,我试图让两个进程在C语言中协作。为此,我使用了pause()和用户信号,据我所知,pause()使程序休眠,直到收到信号为止。我正在这样做: pid_t child = fork(); if(child < 0) { perror("Fork error"); exit(1); } else if (child > 0) { //parent process //do something here, then: printf("Pare
pause()
和用户信号,据我所知,pause()
使程序休眠,直到收到信号为止。我正在这样做:
pid_t child = fork();
if(child < 0) {
perror("Fork error");
exit(1);
}
else if (child > 0) { //parent process
//do something here, then:
printf("Parent pausing\n");
pause();
printf("parent received sigusr2\n");
//do something
kill(child, SIGUSR2);
printf("Sent signal to child\n");
sleep(1);
fflush(NULL);
pause();
kill(child,SIGTERM);
waitpid(child, &status, 0);
}
else { //child process
//do something, then
printf("Child sending sigusr2\n");
kill(getppid(), SIGUSR2);
printf("Child pausing\n");
pause();
//do something
kill(getppid(), SIGUSR2);
fflush(NULL);
printf(frompipe);
pause();
}
它就停在那里,好像父进程没有收到信号一样(因为它没有打印父进程收到的sigusr2)。程序终止,但进程在后台卡住。我做错了什么 @Eugene Sh.是正确的:您需要一个信号处理函数。警察说 pause()仅在捕获信号并返回信号捕获函数时返回 为此,请将以下内容添加到您的程序中:
void sigusr2_handler(int) { /* do nothing*/ }
然后,在调用fork()
之前,添加
struct sigaction sa;
sa.handler = sigusr2_handler;
sa.mask = 0;
sa.sa_flags = 0;
sigaction(SIGUSR2, sigusr2_handler);
使用sigaction
意味着此处理程序将一直存在,直到您禁用它为止(与signal(2)
不同)。将其置于fork
调用之前会使其应用于父级和子级;说明:“通过fork(2)
创建的子级继承其父级信号处理的副本。”
使用此代码,您的pause()
调用将返回。如果您想在sigusr2\u handler
中打印消息或执行其他操作,您当然可以这样做,但我读过的一般建议是让处理程序尽可能简单
(顺便说一句,我还会在每次
printf
之后添加fflush
调用,以确保调试时的安全。我认为这不必要,但也不会有什么坏处!)您有针对这些信号的信号处理程序吗?Frommanpause
:pause()使调用进程(或线程)休眠,直到发送终止进程或调用信号捕获函数的信号。从同一手册页上看,sigssuspend(2)
可能值得一看。我想pause()
本身捕获了信号。。。是吗?man
页面很清晰,不是吗?
struct sigaction sa;
sa.handler = sigusr2_handler;
sa.mask = 0;
sa.sa_flags = 0;
sigaction(SIGUSR2, sigusr2_handler);