1、主线程1创建线程2, 线程2又创建线程3......
主线程退出, 则所有线程都退出,进程结束。 但其他的线程结束不会导致由其创建的线程结束
2、被忽略的信号(默认的或是手动设置的),与被阻塞还是未阻塞无关,内核似乎就没发给进程,也就没有什么未决的状态, 也不会导致sigsuspend返回
对信号的处理层次:忽略(根本就不发出通知,也就无所谓阻塞还是捕获了)、阻塞(导致未觉)、捕获函数(含默认)
3、SIGKILL、SIGSTOP不会被阻塞和忽略
4、pthread_attr_setscope(&attr, scope), linux只支持PTHREAD_SCOPE_SYSTEM,默认不用调用设置此属性
POSIX.1-2001 only requires that an implementation support one of these contention scopes, but permits both to be supported. Linux supports PTHREAD_SCOPE_SYSTEM,
but not PTHREAD_SCOPE_PROCESS.
5、多线程中设置信号屏蔽字用pthread_sigmask(sigprocmask的行为在多线程中可以认为未定义)
6、pthread_sigmask()设置的屏蔽字会在执行pthread_create时被子线程继承(调用pthread_create之后的在本线程内的修改只对本线程有效)
pthread_create(&tid, NULL, th_f2, NULL);
sigemptyset(&newmask);
sigaddset(&newmask, SIGTERM);
if ((err = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask)) != 0) {
printf("pthread_sigmask err, %d\n", err);
return -1;
}
这里设置的SIGTERM屏蔽字将不再会影响th_f2
7、某线程改变某信号的处理函数会影响所有线程(信号处理函数是进程共享);
8、执行exec函数时,由于进程环境已替换为新程序,我们设置的捕捉函数入口地址变得没有意义,so我们设置的信号处理函数不被继承,一般恢复为默认;但是我们设置的忽略会被继承,阻塞也会被继承
父进程的程序
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
signal(SIGUSR1,SIG_IGN);
if ((pid = fork()) < 0) {
printf("fork failed\n");
return -1;
}
else if (pid == 0) {
execl("./giveit", "giveit", (char *)0);
_exit(-1);
}
waitpid(pid, NULL, 0);
return 0;
}
exec执行的程序
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int n = 0;
while (1) {
printf("giveit: %d\n", n);
sleep(1);
}
return 0;
}
执行后, 执行kill -USR1 <子进程giveit的id> 子进程不会终止, 而USR1的默认处理是终止进程