当前位置:  技术问答>java开发知识 iis7站长之家

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...

有这样一段代码

#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);

    
 
 

您可能感兴趣的文章:

  • 关于sigprocmask和sigsuspend的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sigsuspend中的参数和sigsuspend要处理的信号是不是没关系
  • pause()和sigsuspend()区别
  • 信号阻塞函数sigsuspend()的使用。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3