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 条评论

发表回复

您的电子邮箱地址不会被公开。