为什么我无法捕捉到 parent 发送的 child 中的信号?
Why I can't catch the signal in the child which is sent by parent?
我刚刚了解 C 中的信号,我想将信号从 parent 发送到 child,但我不明白为什么处理程序在这里不起作用...
我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
void handler(int signumber){
printf("Signal with number %i has arrived\n",signumber);
}
int main(){
sigset_t sigset;
sigemptyset(&sigset); //empty signal set
sigaddset(&sigset,SIGTERM); //SIGTERM is in set
//sigfillset(&sigset); //each signal is in the set
sigprocmask(SIG_BLOCK,&sigset,NULL); //signals in sigset will be blockedhere
signal(SIGTERM,handler); //signal and handler is connetcted
pid_t child=fork();
if (child>0)
{
printf("I'm parrent\n");
printf("Waits 2 seconds, then send a SIGTERM %i signal (it is blocked)\n",SIGTERM);
sleep(2);
kill(getppid(),SIGTERM);
printf("I sent it.\n");
}
else
{
wait(NULL);
sleep(2);
printf("I'm the child wainting for signal.\n");
sigprocmask(SIG_UNBLOCK,&sigset,NULL);
int status;
wait(&status);
printf("Child process ended\n");
}
return 0;
}
这是结果:
I'm parrent
Waits 2 seconds, then send a SIGTERM 15 signal (it is blocked)
I'm the child wainting for signal.
Child process ended
I sent it.
还有一件事,我知道,我必须使用 sigsuspend(sigset);
而不是处理程序,因为 printf
isn't safe in handler,但在这种情况下如何使用它?
等待主要是为了收获child状态(一般是观察child状态变化)。
在 child 中使用它没有多大意义。
是的,您可以使用 sigsuspend
等待信号。
它可能看起来像这样:
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#define WRITE(Str) (void)write(1,Str,strlen(Str))
void handler(int signumber)
{
WRITE("Signal arrived\n");
}
int main(){
sigset_t sigset;
sigemptyset(&sigset); //empty signal set
sigaddset(&sigset,SIGTERM); //SIGTERM is in set
sigprocmask(SIG_BLOCK,&sigset,NULL); //signals in sigset will be blockedhere
signal(SIGTERM,handler); //signal and handler is connetcted
pid_t child=fork();
if(0>child) return EXIT_FAILURE;
if (child>0) {
int status;
printf("I'm the parent\n");
printf("Waits 2 seconds, then send a SIGTERM %i signal (it is blocked)\n",SIGTERM);
sleep(2);
kill(child,SIGTERM);
printf("I sent it.\n");
}
else
{
sigemptyset(&sigset); //the child has a different addr-space
//so this won't affect the parent
printf("I'm the child waiting for signal.\n");
sigsuspend(&sigset);
printf("Child process ended\n");
}
return 0;
}
有关详细信息,请参阅各个系统函数的手册页。您也应该检查 return 代码,即使这些特定函数中的大多数通常不会失败,除非您调用错误(有些会,例如,如果您不正确, fork() 实际上会失败)内存)。
我刚刚了解 C 中的信号,我想将信号从 parent 发送到 child,但我不明白为什么处理程序在这里不起作用...
我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
void handler(int signumber){
printf("Signal with number %i has arrived\n",signumber);
}
int main(){
sigset_t sigset;
sigemptyset(&sigset); //empty signal set
sigaddset(&sigset,SIGTERM); //SIGTERM is in set
//sigfillset(&sigset); //each signal is in the set
sigprocmask(SIG_BLOCK,&sigset,NULL); //signals in sigset will be blockedhere
signal(SIGTERM,handler); //signal and handler is connetcted
pid_t child=fork();
if (child>0)
{
printf("I'm parrent\n");
printf("Waits 2 seconds, then send a SIGTERM %i signal (it is blocked)\n",SIGTERM);
sleep(2);
kill(getppid(),SIGTERM);
printf("I sent it.\n");
}
else
{
wait(NULL);
sleep(2);
printf("I'm the child wainting for signal.\n");
sigprocmask(SIG_UNBLOCK,&sigset,NULL);
int status;
wait(&status);
printf("Child process ended\n");
}
return 0;
}
这是结果:
I'm parrent
Waits 2 seconds, then send a SIGTERM 15 signal (it is blocked)
I'm the child wainting for signal.
Child process ended
I sent it.
还有一件事,我知道,我必须使用 sigsuspend(sigset);
而不是处理程序,因为 printf
isn't safe in handler,但在这种情况下如何使用它?
等待主要是为了收获child状态(一般是观察child状态变化)。
在 child 中使用它没有多大意义。
是的,您可以使用 sigsuspend
等待信号。
它可能看起来像这样:
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#define WRITE(Str) (void)write(1,Str,strlen(Str))
void handler(int signumber)
{
WRITE("Signal arrived\n");
}
int main(){
sigset_t sigset;
sigemptyset(&sigset); //empty signal set
sigaddset(&sigset,SIGTERM); //SIGTERM is in set
sigprocmask(SIG_BLOCK,&sigset,NULL); //signals in sigset will be blockedhere
signal(SIGTERM,handler); //signal and handler is connetcted
pid_t child=fork();
if(0>child) return EXIT_FAILURE;
if (child>0) {
int status;
printf("I'm the parent\n");
printf("Waits 2 seconds, then send a SIGTERM %i signal (it is blocked)\n",SIGTERM);
sleep(2);
kill(child,SIGTERM);
printf("I sent it.\n");
}
else
{
sigemptyset(&sigset); //the child has a different addr-space
//so this won't affect the parent
printf("I'm the child waiting for signal.\n");
sigsuspend(&sigset);
printf("Child process ended\n");
}
return 0;
}
有关详细信息,请参阅各个系统函数的手册页。您也应该检查 return 代码,即使这些特定函数中的大多数通常不会失败,除非您调用错误(有些会,例如,如果您不正确, fork() 实际上会失败)内存)。