SIGCONT

 

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void sig_chld(int signo){
  printf("get signal:%d\n", signo);
}

int main(void){
  pid_t pid;
  struct sigaction new_action,old_action;
  new_action.sa_handler=sig_chld;
  if(sigemptyset(&new_action.sa_mask)==-1){
          printf("empty new_action.sa_mask error\n");
          exit(1);
  }

 // new_action.sa_flags = SA_NOCLDSTOP;
  new_action.sa_flags = 0;

  sigaction(SIGCHLD,&new_action,&old_action);
 
  if((pid=fork())==-1){
          perror("fork error");
          exit(1);
  }else if(pid==0){
          if(kill(getpid(),SIGSTOP)==-1){
              exit(1);
          }

          int index = 0 ;
          while(1) {
            if (index++ > 4) {
              printf("child done\n");
              exit(0);
            }

            printf("index:%d\n", index);
            sleep(1);
          }
  }else{
          int i = 0;
          while (i++ < 100) {
             printf("i:%d\n", i);
             sleep(2);
             if (i == 3) {
                printf("send signal\n");
                kill(pid,SIGCONT);
             } 
          }

          printf("parent done\n");
 
  }

  exit(0);
}

 

 

result:

mutian@mutian:~/soft/compile/sparrow$ ./a.out
i:1
get signal:17
i:2
i:3
send signal
i:4
get signal:17
i:5
index:1
index:2
i:6
index:3
index:4
i:7
index:5
child done
get signal:17
i:8
parent done

SA_NOCLDSTOP:
一般当进程终止或停止(ubuntu12.04上测试,进程恢复运行也会产生SIGCHLD信号)时都会产生SIGCHLD信号,但若对SIGCHLD信号设置了SA_NOCLDSTOP标志, 则只有当子进程终止时才产生此信号。

mutian@mutian:~/soft/compile/sparrow$ ./a.out 
i:1
i:2
i:3
send signal
i:4
index:1
index:2
i:5
index:3
index:4
i:6
index:5
child done
get signal:17
i:7
i:8
parent done

 

posted @ 2015-12-03 21:40  牧 天  阅读(1140)  评论(0)    收藏  举报