https://blog.csdn.net/Hello_World_213/article/details/128614985
https://www.cnblogs.com/gpf1997/p/17728883.html (古老的进程间通信方式)
目录
信号的来源
https://blog.csdn.net/weixin_35384453/article/details/116928200
线程信号掩码
在Linux系统中,pthread_sigmask是一个用于线程信号掩码操作的函数。它可以用来设置和获取线程的信号掩码,从而控制线程对信号的响应。
https://blog.51cto.com/u_15410314/10237252
https://blog.csdn.net/lcb1992/article/details/53511508
https://www.cnblogs.com/qq78292959/archive/2012/04/05/2432985.html
父进程正常退出或死亡怎么告诉子进程
https://blog.csdn.net/qq_48220362/article/details/132747463
prctl(PR_SET_PDEATHSIG,SIGKILL);
新API
https://blog.csdn.net/gdutliuyun827/article/details/8460417
三种新的fd加入linux内核的的版本:
signalfd:2.6.22
timerfd:2.6.25
eventfd:2.6.22
三种fd的意义:
signalfd:传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、poll、epoll等监听队列中。
timerfd:可以实现定时器的功能,将定时器抽象为文件描述符,当定时器到期时可以对其read,这样也可以放到监听队列的主循环中。
eventfd:实现了线程之间事件通知的方式,eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。
应用场景
1.多进程调试
下面这段代码会暂停进程,假设进程号为40727.
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[]) {
printf("Process about to raise SIGSTOP...\n");
if (raise(SIGSTOP) != 0) { // 发送SIGSTOP信号,暂停进程
perror("raise failed");
return 1;
}
printf("Process has been stopped. Sleeping for 2 seconds...\n");
sleep(2); // 睡眠2秒,观察被暂停的进程状态
printf("Process about to raise SIGCONT...\n");
if (raise(SIGCONT) != 0) { // 发送SIGCONT信号,继续进程
perror("raise failed");
return 1;
}
printf("Process has been continued. Exiting...\n");
return 0;
}
通过kill -l查询SIGCONT信号编号为18,向进程发送信号kill -18 40727
让进程继续运行。
通过以上的小代码,对于多进程调试,在进程SIGSTOP之前先打印出进程的id,然后gdbserver attach上,然后再kill -18 pid
激活进程进行调试。
0 条评论