• linux内核分析:进程通讯方式


    信号 

    一旦有信号产生,我们就有下面这几种,用户进程对信号的处理方式。

    1.执行默认操作。Linux 对每种信号都规定了默认操作,例如,上面列表中的 Term,就是终止进程的意思。Core 的意思是 Core Dump,也即终止进程后,通过 Core Dump 将当前进程的运行状态保存在文件里面,方便程序员事后进行分析问题在哪里。

    2.捕捉信号。我们可以为信号定义一个信号处理函数。当信号发生时,我们就执行相应的信号处理函数。

    3.忽略信号。当我们不希望处理某些信号的时候,就可以忽略该信号,不做任何处理。有两个信号是应用进程无法捕捉和忽略的,即 SIGKILL 和 SEGSTOP,它们用于在任何时候中断或结束某一进程。

    还有一个设置就是设置了 SA_INTERRUPT,清除了 SA_RESTART。这是什么意思呢?我们知道,信号的到来时间是不可预期的,有可能程序正在调用某个漫长的系统调用的时候(你可以在一台 Linux 机器上运行 man 7 signal 命令,在这里找 Interruption of system calls and library functions by signal handlers 的部分,里面说得非常详细),这个时候一个信号来了,会中断这个系统调用,去执行信号处理函数,那执行完了以后呢?系统调用怎么办呢?

    这时候有两种处理方法,一种就是 SA_INTERRUPT,也即系统调用被中断了,就不再重试这个系统调用了,而是直接返回一个 -EINTR 常量,告诉调用方,这个系统调用被信号中断了,但是怎么处理你看着办。如果是这样的话,调用方可以根据自己的逻辑,重新调用或者直接返回,这会使得我们的代码非常复杂,在所有系统调用的返回值判断里面,都要特殊判断一下这个值。

     

     

    在这里,我们看到,在学习进程数据结构中 task_struct 里面的 sigpending。在上面的代码里面,我们先是要决定应该用哪个 sigpending。这就要看我们发送的信号,是给进程的还是线程的。如果是 kill 发送的,也就是发送给整个进程的,就应该发送给 t->signal->shared_pen

  • 相关阅读:
    C++模板初阶 —— 函数模板、类模板、模板的声明和定义分离(多文件使用的注意事项)
    锐捷——Telnet登陆时使用密码登陆路由器
    nacos协议
    配置binlog并使用Canal实现Mysql定制同步数据的功能
    探究平台化设计的核心思想和Lattice(TMF)的设计原则
    uni-app:多种方法写入图片路径
    Qt 大型工程项目的搭建过程,模块分类详解
    像MySql一样在控制台输出打印漂亮的表格
    chatgpt赋能python:Python怎么入侵手机
    Linux- pipe()系统调用
  • 原文地址:https://blog.csdn.net/m0_63691156/article/details/133095700