linux 线程 信号

本文深入探讨了多线程环境下线程间的创建、生命周期管理,以及信号处理机制,包括信号的忽略、阻塞、捕获及其对多线程的影响。详细解释了SIGKILL、SIGSTOP信号的作用,并通过实例演示了信号屏蔽与恢复的机制。
摘要由CSDN通过智能技术生成

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的默认处理是终止进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值