Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111914
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 360
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-07 00:14
文章分类

全部博文(27)

文章存档

2015年(1)

2014年(20)

2013年(6)

我的朋友

分类: C/C++

2013-11-30 20:49:32

man 7 signal 有如下一段描述:
A child created via fork(2) inherits a copy of its parent’s signal mask; the signal mask is preserved across execve(2).

点击(此处)折叠或打开

意思是子进程会继承父进程的signal mask。例如 A 进程已经阻塞 SIGINT 信号, 而后A 进程创建B进程,B进程也会阻塞住SIGINT信号(B 程序没有阻塞SIGINT 信号的代码)。代码验证如下:
 A 进程的程序代码, 编译方式 :cc main.c -o main

点击(此处)折叠或打开

  1. /* main.c */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <signal.h>

  8. int main(int argc, char *argv[])
  9. {

  10.     sigset_t set;
  11.     sigemptyset(&set);
  12.     sigaddset(&set, SIGINT);


  13.     if (sigprocmask(SIG_BLOCK, &set, NULL) != 0)
  14.     {
  15.         fprintf(stderr, "call sigprocmask failed, err msg:%s \n", strerror(errno));
  16.         exit(-1);
  17.     }


  18.     pid_t pid = vfork();
  19.     if (pid == 0)
  20.     {
  21.         execl("./a.out", "./a.out", NULL);
  22.     }
  23.     else if (pid < 0)
  24.     {
  25.         fprintf(stderr, "vfork failed, err msg: %s\n", strerror(errno));
  26.         exit(-1);
  27.     }


  28.     exit(0);
  29. }
B 进程的程序代码, 编译方式 :cc test.c

点击(此处)折叠或打开

  1. /* test.c */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <signal.h>

  8. int main(int argc, char *argv[])
  9. {
  10.     while (1)
  11.     {
  12.         fprintf(stderr, "############## Just For Test .! ##################\n");
  13.         sleep(10);
  14.     }
  15.     exit(0);
  16. }

直接运行./a.out, 可以用 kill -INT `pidof a.out` 将 a.out 进程杀死。
通过./main 运行a.out , 不能使用 kill -INT `pidof a.out` 将 a.out 进程杀死。

阅读(2562) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~