sigsuspend问题
来源: 互联网 发布时间:2016-07-23
本文导语: 有这样一段代码 #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX 1024 static void err_sys(char *fmt,...); void pr_mask(const char *str); static void sig_int(in...
有这样一段代码
想实现,父子进程相互发送信号,先是子进程暂停(sigsuspend),等待父进程发SIGINT信号,然后向父进程发SIGUSR1信号;父进程先向子进程发SIGINT信号,然后等待子进程发SIGUS1信号。在运行这个程序的时候,只是输出 from parent, 没有输出from child, 各位大侠,这是为什么呢?是逻辑不对么,还是有其它因素?
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1024
static void err_sys(char *fmt,...);
void pr_mask(const char *str);
static void sig_int(int signo){
puts("from parent");
}
static void sig_usr(int signo){
puts("from child");
}
int main(int argc, char **argv){
pid_t pid;
sigset_t mask;
sigemptyset(&mask);
pid = fork();
if(pid==0){
signal(SIGINT,sig_int);
sigsuspend(&mask);
kill(getpid(),SIGUSR1);
exit(0);
}else if(pid>0){
signal(SIGUSR1,sig_usr);
kill(pid,SIGINT);
sigsuspend(&mask);
exit(0);
}
return 0;
}
static void err_sys(char *fmt,...){
char buf[MAX];
va_list ap;
va_start(ap,fmt);
vsnprintf(buf,MAX,fmt,ap);
va_end(ap);
fputs(buf,stderr);
exit(1);
}
想实现,父子进程相互发送信号,先是子进程暂停(sigsuspend),等待父进程发SIGINT信号,然后向父进程发SIGUSR1信号;父进程先向子进程发SIGINT信号,然后等待子进程发SIGUS1信号。在运行这个程序的时候,只是输出 from parent, 没有输出from child, 各位大侠,这是为什么呢?是逻辑不对么,还是有其它因素?
|
因为你子进程向父进程发送了SIGUSR1信号后就立刻退出了,所以就导致也发送了SIGCHLD信号给父进程,所以SIGCHLD冲掉了SIGUSR1,所以当父进程调度到的时候SIGCHLD信号导致sigsuspend返回,然后退出。所以没有打印from child.
上面是我猜的,如果想验证可以在exit(0)之前加一句sleep(2);
上面是我猜的,如果想验证可以在exit(0)之前加一句sleep(2);