LINUX下多线程和信号
说实话,信号是我讨厌的东西,在我些的代码中,我都想用最简单的办法来处理它,现在遇到多线程中信号的处理,APUE中的说法也看得不是很懂,CSDN中一位朋友有如下的总结,先记在这里。
1. 默认情况下,信号将由主进程接收处理,就算信号处理函数是由子线程注册的
2. 每个线程均有自己的信号屏蔽字,可以使用sigprocmask函数来屏蔽某个线程对该信号的响应处理,仅留下需要处理该信号的线程来处理指定的信号。
3. 对某个信号处理函数,以程序执行时最后一次注册的处理函数为准,即在所有的线程里,同一个信号在任何线程里对该信号的处理一定相同
4. 可以使用pthread_kill对指定的线程发送信号
APUE的说法:每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有的线程共享的,
这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为后,所
有的线程都共享这个处理行为的改变。这样如果一个线程选择忽略某个信号,而其他线程可
以恢复信号的默认处理行为,或者为信号设置一个新的处理程序,从而可以撤销上述线程的
信号选择。
进程中的信号是送到单个线程的,如果信号与硬件故障或者计时器超时有关,该型号就被发
送到引起该事件的线程中去,而其他的信号则被发送到任意一个线程。
sigprocmask的行为在多线程的进程中没有定义,线程必须使用pthread_sigmask
总结:一个信号可以被没屏蔽它的任何一个线程处理,但是在一个进程内只有一个多个线程共用的处理函数。
相关文档:
; break;
}
if (type != EV_SYN)
&nbs ......
o: 编译的目标文件
a: 静态库,其实就是把若干o文件打了个包
so: 动态链接库(共享库)
lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息
la: 使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息
1 libtool的工作原理
libtool 是一个通用库支持脚本,将使用 ......
曾做过signal相关的一点儿开发,谈谈我的一些理解。
首先,需要理解几个signal相关的函数。
sigaddset(sigset_t* sigSet, int sigNum ) : 将信号sigNum 添加到信号集 sigSet 中;
sigdelset(sigset_t* sigSet, int sigNum) : 将信号 sigNum 从信号集 sigSet 中删除;
......
一、什么是init
init是Linux系统操作中不可缺少的程序之一。 是一个由内核启动的用户级进程。
内核启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式来启动其他用户级的进程或服务。所以,init始终是第一个进程(其PID始终为1)。
内核 ......
main.c
//初始化队列
void InitQueue(LiQueue *q)
{
q=(LiQueue*)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}
//判断是否为空
int QueueEmpty(LiQueue *q)
{
if(q->rear==NULL)
{
return 1;
}
else
{
......