分类: 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
B 进程的程序代码, 编译方式 :cc test.c点击(此处)折叠或打开
- /* main.c */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #include <signal.h>
- int main(int argc, char *argv[])
- {
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set, SIGINT);
- if (sigprocmask(SIG_BLOCK, &set, NULL) != 0)
- {
- fprintf(stderr, "call sigprocmask failed, err msg:%s \n", strerror(errno));
- exit(-1);
- }
- pid_t pid = vfork();
- if (pid == 0)
- {
- execl("./a.out", "./a.out", NULL);
- }
- else if (pid < 0)
- {
- fprintf(stderr, "vfork failed, err msg: %s\n", strerror(errno));
- exit(-1);
- }
- exit(0);
- }
点击(此处)折叠或打开
- /* test.c */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #include <signal.h>
- int main(int argc, char *argv[])
- {
- while (1)
- {
- fprintf(stderr, "############## Just For Test .! ##################\n");
- sleep(10);
- }
- exit(0);
- }
直接运行./a.out, 可以用 kill -INT `pidof a.out` 将 a.out 进程杀死。
通过./main 运行a.out , 不能使用 kill -INT `pidof a.out` 将 a.out 进程杀死。