IPC——线程信号问题

所有的线程共享相同的信号处理方式

主线程将SIGINT信号的处理方式设置为了捕获,那么所有的次线程共享这一处理方式,如果其中某个次线程改变了该信号的处理方式,那么所有的线程将共享这一改变。

回顾“信号屏蔽字”和“未决信号字”

作用

“信号屏蔽字”和“未决信号字”作用同进程信号,参考IPC——信号

修改信号屏蔽字函数

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

没有次线程时

此时整个进程只有一个主线程,整个进程的“信号屏蔽字”和“未决信号字”,就是主线程的“信号屏蔽字”和“未决信号字”。

有次线程时

每个次线程都有自己独立的“信号屏蔽字”和“未决信号字”,次线程的“信号屏蔽字”和“未决信号字”是从主线程的“信号屏蔽字”和“未决信号字”复制而来的,在复制时,

(1)次线程的“信号屏蔽字”会保留从主线程“信号屏蔽字”所复制的值。

(2)次线程的“未决信号字”会清空,也就是说不会保留所复制值。

如果次线程对某些信号有特殊的“响应需求”的话,可以自己调用如下函数,修改次线程自己的“信号屏蔽字”,以实现将某个信号打开或者屏蔽。

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

多线程时是如何响应信号?

(1)进程收到信号后,进程会找到某一个没有屏蔽该信号的线程去处理在这个信号找哪一个线程,由进程说了算。

(2)如果所有的线程都屏蔽了该信号的话,信号发生时,进程会将未决信号记录到某个线程的“未决信号字”中。同样的,找哪一个线程,由进程说了算。

(3)当线程收到进程判给它的信号后,而且如果该信号的处理方式还是捕获的话这个线程在运行时会被中断,然后去执行信号捕获函数,当信号捕获函数执行完毕后,才会返回被中断的线程,接着执行。

原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9450668.html

时间: 2024-10-08 20:27:36

IPC——线程信号问题的相关文章

linuxc线程信号-pthread_cond_wait理解

pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)函数 传入的参数mutex用于保护条件,因为我们在调用pthread_cond_wait时,如果条件不成立我们就进入阻塞,但是进入阻塞这个期间,如果条件变量改变了的话,那我们就漏掉了这个条件.因为这个线程还没有放到等待队列上,所以调用pthread_cond_wait前要先锁互斥量, 即调用pthread_mutex_lock(),pthread_cond_wait在把线程

41 windows_41_Thread_Semaphore 线程 - 信号

windows_41_Thread_Semaphore 线程 - 信号 // windows_41_Thread_Semaphore.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "windows.h" /* 效果:前面很快出五个,后面一秒出一个 */ //1.创建信号量 //CreateSemaphore //2.等候信号量 //WaitForSingleObject //WaitForMultipleO

Linux中都线程信号的处理

1. 博文:Linux多线程中使用信号-1  http://blog.csdn.net/qq276592716/article/details/7325250 2. 博文:Linux多线程信号总结  http://blog.chinaunix.net/uid-26932153-id-3227403.html 3.博文: sigprocmask()函数实例详解 http://blog.sina.com.cn/s/blog_6af9566301013w66.html 4.博文:  Linux信号之

线程与信号,线程与锁

#include<stdio.h> #include<apue.h> #include<pthread.h> pthread_mutex_t number_mutex = PTHREAD_MUTEX_INITIALIZER; int globvar = 0 ; void *write_p(void *arg){ while(1){ pthread_mutex_lock(&number_mutex); globvar++; printf("the wri

内核线程对信号的处理策略

一.引出 大家都知道,信号是在进程返回用户态的时候触发执行的一种机制,但是对于内核线程来说,它们并不会返回用户态.这就好像<大话西游>里打劫脚底板的时候那位坐轿的官人没有脚底板一样尴尬.另一方面,通过sigprocmask是不能屏蔽掉SIGKILL和SIGSTOP两个信号的,所以如果我们通过kill -9 来杀死一个内核线程的话,内核线程是否会被杀死,如果会,它又是何时如何处理信号的呢? 二.内核线程对信号的处理 1.屏蔽 daemonize: /* Block and flush all s

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

Linux IPC简单总结

###Linux IPC### --------------- ##消息传递## - 信号: 非亲缘,传递信息少,只能是控制信息而不是数据信息 - 管道: 要亲缘,无边界字节流,先进先出,消耗掉就没了,没有窥探功能MSG_PEEK - FIFO: 非亲缘,无边界字节流,先进先出,消耗掉就没了,没有窥探功能MSG_PEEK - Socket: 非亲缘,边界可有可无,效率较低 - Unix Socket: 非亲缘,边界可有可无,比Socket的效率高,比共享内存的效率低 - 消息队列:无亲缘,有边界

Linux进程与线程的区别

cnyinlinux 本文较长,耐心阅读,必有收获! 进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念,在工作实际中去运用成为了焦点.而资深工程师则在考虑系统层面如何实现两种技术及其各自的性能和实现代价.以至于到今天,Linux内核还在持续更新完善(关于进程和线程的实现模块也是内核完善的任务之一). 本文将以一个从事Linux平台系统开发的程序员角

01 UNIX IPC 第一弹 综述

UNIX IPC 第一弹 综述 0. 为什么会有这边文章? 一直对这方面的技术只有些模棱两可的了解,但又没有个统一完整的认识,在学习了<Modern Operating System>和<Advanced Programming in the UNIX Environmet>的相关章节后,做一个总结. 1. 什么是进程(process)?为什么要有进程? 进程是可执行程序加载到内存后,在CPU上执行的代码,包括一些相关的资源及状态,是一个动态的,变化的状态. 进程是系统资源分配的基