首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

进程退出时如何确保进程退出

前言 进程退出的时候,父进程能够收到进程退出信号,便于管理,但是有时候又需要在父进程退出的时候,进程退出,该怎么办呢? 父进程退出时,进程会如何?...内容很多,主要意思为:设置一个信号,当父进程退出的时候,进程将会收到该信号。 那么根据这个,我们完全可以在父进程退出时,也给进程一个退出信号。...可以看到,由于加入了 prctl(PR_SET_PDEATHSIG,SIGKILL); 在父进程退出时,进程将会收到SIGKILL信号,而进程收到该信号的默认动作则是退出。...总结 有些情况下,我们常常需要父子进程共存亡,进程退出时,父进程可以通过wait捕捉进程退出状态,但是父进程退出时,进程却难以得知。...因此,在最初fork进程的时候,便表明了,当父进程退出的时候,进程收到SIGKILL信号,最终也退出。以此达到同生共死的目的。

12.2K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    L010Linux和androidNDK之linux避免僵尸进程进程退出的处理

    L010Linux和androidNDK之linux避免僵尸进程进程退出的处理 如果你在程序中fork出一个进程,没有好好处理进程退出后的相关事宜,那么就有可能召唤出传说中进程界的僵尸---僵尸进程...,并不能将其完全销毁) 僵尸进程是怎么样产生 在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程退出状态等信息供其他进程收集...如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,...WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真 WTERMSIG(status)取得进程信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。...WSTOPSIG(status)取得引发进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。 kill -STOP 1234 进程暂停。

    3.1K40

    Linux进程信号信号处理】

    比如进程正在执行一个重要的 IO,突然一个终止信号发出,IO 立即终止,对进程、磁盘都不好 因此信号在 产生 后,需要等进程将 更重要 的事忙完后(合适的时机),才进行 处理 合适的时机:进程从...每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...,还需要坠入 内核态 通过一张图快速记录信号的 处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?..." << endl; // 最终不退出进程 int n = 10; while (n--) { // 获取进程的 未决信号集 sigset_t...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号信号处理】的全部内容了,本文对信号的处理时机做了探讨

    24910

    Linux进程信号信号产生】

    ---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...,部分信号只做了解即可 1.2、信号的作用 早在 《Linux进程学习【进程状态】》 我们就已经使用过 信号 了,比如: kill -9 pid 终止进程运行 kill -19 pid 暂停进程运行 kill...按系统默认,将忽略此信号。如果父进程希望被告知其进程的这种状态改变,则应捕捉此信号。...信号捕捉函数中通常要调用一种 wait 函数以取得进程 PID 及其终止状态 18 SIGCONT 可以通过发送该信号让一个停止的进程继续运行 19 SIGSTOP 这时一个作业控制信号,该信号用于停止一个进程...、控制、等待 中,我们谈到了 当进程异常退出时(被信号终止),不再设置退出码,而是设置 core dump 位 及 终止信号 也就是说,父进程可以借此判断进程是否产生了 核心转储 文件 ---- 总结

    30910

    Linux——进程信号

    SIGCHLD信号 用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待进程结束,也可以非阻 塞地查询是否有进程结束等待清理(也就是轮询的方式)。...其实,进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自 定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,进程 终止时会通知父进程...,父进程信号处理函数中调用wait清理进程即可。...此方法对于Linux可用,但不保证在其它UNIX系统上都可用。 这里子进程退出也没留下任何痕迹。 还有一个细节: 明明对于17号信号处理就是”忽略“嘛?...因为OS会识别,如果是手动设置的,就会修改未来创建进程的时候的退出的属性等等。

    2.7K30

    Linux进程信号信号保存】

    : SIG_DFL 默认处理动作,大多数信号最终都是终止进程 SIG_IGN 忽略动作,即进程收到信号后,不做任何处理动作 handler 用户自定义的信号执行动作 注意: 信号阻塞 是一种手段,可以发生在...,信号才被递达,进程被终止 如何证明信号已递达?...很简单,因为当前 2 号信号的执行动作为终止进程进程都终止了,当然看不到 解决方法:给 2 号信号先注册一个自定义动作(别急着退出进程) 所以改进后的代码如下: #include ..." << endl; //最终不退出进程 } static void DisplayPending(const sigset_t pending) { // 打印 pending 表...---- 总结 以上就是本次关于 Linux进程信号信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,

    20320

    Linux进程信号

    ,向目标进程信号,目标进程在合适的时候处理这个信号,对于2号和3号信号处理动作默认为终止进程 2.系统调用 除了键盘向前台进程发送信号之外,前台进程会影响shell,linux规定跟shell交互的时候只允许有一个前台进程...我们可以看到上面的结果:收到信号不一会引起进程退出 **收到信号不一定会引起进程退出!...quit); printf("注意,我是正常退出的\n"); return 0; } ---- 十一、SIGCHLD信号 进程退出时,会向父进程发送17号信号SIGCHLD的。...n",getpid(),getppid()); pid_t id = fork(); if(id==0) { printf("我是进程:%d,ppid:%d,我要退出了...,该等还得等,而如果我们手动设置了SIG_IGN,进程退出时发送给父进程信号会被父进程忽略,但是进程会被OS回收,这是有所区别的。

    18310

    Linux进程信号(下)

    1.信号处理相关问题 信号处理,不是可以立即处理的,而是在合适的时候 不懂点击: 信号的产生第三点 ---- 什么时候是合适的时候?...当进程从内核态切换回用户态的时候,进程会在操作系统的指导下,进行信号的检测与处理 ---- 内核态与用户态概念的理解 用户态:执行你写的代码的时候,用户所处的状态 内核态:执行操作系统的代码的时候,进程所处的状态...为了解决通过虚拟地址的方式随便去访问操作系统里面的代码和数据 提出用户态和内核态 ---- 若为用户态,想要去访问操作系统里面的代码和数据时,CPU就会拒绝执行代码,操作系统就可以识别非法访问,即硬件异常,向目标进程发送信号终止进程...用户无法直接更改 操作系统提供的所有的系统调用,内部在正式执行调用逻辑的时候,会去修改执行级别 信号处理的整体过程 进程返回时,需要进行信号检测 当执行完某种任务时,先找到对应的进程,检测对应的信号...若block为0(阻塞信号不执行),pending为1(收到信号),执行处理方法 若为忽略信号,则将pending由1改为0 ---- 若为自定义捕捉,当系统跳转过去执行的是自己写的方法 实际上自己写的方法是由用户态实现的

    17140

    Linux进程信号总结

    同时也证明了,当我们按Ctrl+C时进程确实是收到了2号信号信号的发送与记录 我们使用kill -l命令可以查看Linux当中的信号列表。...core dump标志 回想一下进程等待函数waitpid函数的第二个参数: waitpid函数的第二个参数status是一个输出型参数,用于获取进程退出状态。...此时父进程使用waitpid函数便可获取到进程退出时的状态,根据status的第7个比特位便可得知进程在被终止时是否进行了核心转储。...return 0; } 运行代码后,即可发现进程退出时收到的是13号信号,即SIGPIPE信号。...,记录该信号的pending位只有一个,如果在同一时刻有多个子进程同时退出,那么在handler函数当中实际上只清理了一个进程,因此在使用waitpid函数清理进程时需要使用while不断进行清理。

    6210

    Linux进程信号(上)

    因为曾经有人培养过你 所以信号没有被产生,也知道怎么该处理它 ---- 2.我们能够认识并处理一个信号,是能因为识别这个信号的 若进程就是我,信号就是一个数字,进程在没有接收信号的时候,它早就知道一个信号该如何处理了...,存在时间窗口,因为没办法直接处理,需要等待后续处理 在时间窗口期间,需要被保存起来 进程收到信号的时候,如果没有立马处理这个信号,需要进程具有记录信号的能力 ---- 信号的产生对于进程来讲是异步的...数字实际上是真正的信号,而大写的名称是宏 ---- 实时操作系统 当前主流的操作系统分为实时和分时, 分时像Linux、windows操作系统,基于时间片操作器调度的,强调的是公平调度 实时 像汽车的车载系统的辅助驾驶...---- Linux通过远程终端访问时,只允许一个进程处于前台,默认情况是bash, 所以在自己的程序运行时输入指令没有任何反应 证明输入 CTRL C 就是向前台进程发送信号 输入 man 2.../mykill 9 对应进程的pid值 9为进程编号 pid值为目标进程 输入loop进程的pid值,从而使用9号信号结束loop进程 raise 输入 man raise 指令 谁调用raise

    16020

    Linux进程信号(中)

    当代码除0时,程序运行后就崩溃了,程序运行变为进程进程运行代码时出现了非法代码,进程退出了 ---- 将内存中的指令数据load到CPU中 状态寄存器中有比特位表示当前计算的状态 CPU中有的寄存器保存未来的计算结果...而该信号为:Floating point exception 浮点数异常 ---- FPE为结尾的正好为8号信号 除0的本质就是触发硬件(CPU)异常 验证为8号信号 ---- 通过设置使进程退出...操作系统发现溢出标志位被置1,硬件发生了异常,传给进程8号信号,但是由于8号信号实现自定义方法,进程并没有退出,而溢出标志位属于进程的上下文,一直作为1存在,操作系统就会一直检测到标志位是1,从而一直给进程发...容我慢慢来说 ---- Linux在系统级别提供了一种能力,可以将一个进程异常的时候, 操作系统可以将该进程在异常的时候,核心代码部分进行核心转储 (将内存中进程的相关数据,全部dump到磁盘中) 一般会在当前进程的运行目录下...Term ,终止进程 ---- 在终端1中运行可执行程序,在终端2中发送2号信号干掉进程 ---- 当干掉进程后,并没有发现以pid结尾的文件 说明使用Term类型的信号,干掉进程后,不发生核心转储

    20830

    Linux进程通信——信号

    Linux下的通信机制是遵从POSIX标准的。34号信号SIGRTMIN信号之前的是早期UNIX操作系统的。它们是不可靠的信号。...(这个和Qt的信号槽差不多) 执行默认动作:Linux对每一个信号都规定了默认操作(可靠信号的默认操作是进程终止)。...然后让进程挂起。轮到父进程执行,父进程执行到kill()函数的时候给进程发了个SIGABRT信号,让进程终止了。然后wait()回收进程,打印My son GG. 执行结果如下: ?...可以看到,进程收到SIGABRT信号后,终止了。...即:终止进程。如果我们需要自定义信号处理方式,那么就需要安装信号Linux安装信号主要由signal()和sigaction()完成。signal是在可靠信号系统调用的基础上实现的,是库函数。

    2.4K30

    Linux系统-进程信号

    Linux系统-进程信号 零、前言 一、信号入门 1、生活角度的信号 2、技术应用角度的信号 3、信号及其处理概念 二、信号产生 1、终端按键产生 2、kill命令发信号 3、软件条件产生信号 4、硬件异常产生信号...;用户按下Ctrl-C,这个键盘输入产生一个硬件中断,被OS获取解释成信号,发送给目标前台进程,前台进程因为收到信号,进而引起进程退出 示图: 注意: Ctrl-C 产生的信号只能发给前台进程。...,并且定位错误代码 Core dump标志位: waitpid函数的第二个参数status是一个输出型参数,用于获取进程退出状态。...系统发送信号的本质:修改进程PCB中的pending位图 如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理 POSIX.1允许系统递送该信号一次或多次,Linux是这样实现的...,修改 flag=1 , while 条件不满足,退出循环,进程退出 优化情况下,键入 CTRL-C ,2号信号被捕捉,执行自定义动作,修改 flag=1 ,但是 while 条件依旧满足,而此时

    3.5K10

    Linux进程信号的发生

    我们可以看看在Linux系统下的信号信号时从 1 - 64 的数字对应信号(32 - 64 是实时信号,暂不考虑) 信号的生命周期可以划分为:预备 -> 产生 -> 保存 -> 处理 。...我们把这个过程研究明白就可以了 2 信号概念的基础储备 信号Linux系统通过的一种向目标进程发送指定事件的方式。要做识别和处理。...即向目标进程发送信号! 那为什么不退出就会一直发信号? 因为寄存器只有一套,但是寄存器里面的数据是属于每一个进程的 — 对应硬件上下文的保存与恢复。...如果进程退出,下一次调度的时候,对寄存器的数据进行恢复时,就会触发溢出标记位的错误,OS就会又一次发送信号!!!...core term 上面我们看到了许多信号的默认动作是core term 。他们有什么区别? 我们来看,进程退出时有一个status,其中的core dump字段我们来仔细看看。

    10010

    Linux进程信号(下)

    注意:以core方式退出的是可以被核心转储的,后续可以快速定位问题;以term退出的,一般都是正常情况下的终止进程(即,没有异常)。...quit); 16 printf("我是正常退出的\n"); 17 return 0; 18 } 六、SIGCHLD信号 进程退出时,会向父进程发送17号信号SIGCHLD...的处理动作置为SIG_IGN,这样fork处理的进程,在终止时会自动清理掉,不会通知父进程,也不会产生僵尸进程。...默认是收到信号就忽略处理,但是该等还是要等; 手动设置的SIG_IGN,进程退出时发送给父进程信号会被父进程忽略,但是进程会被OS回收。 这两者是有区别的,含义不一样。...本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

    24620

    Linux进程信号详解【下】

    这样,当进程退出的时候我们就可以通过core定位到进程为什么退出,以及执行到哪步代码退出的。所以,core文件的作用就是帮助我们调试。   ...SIGCHLD信号   我们在学习进程的时候曾经说过,僵尸进程出现的原因是父进程没有回收进程,实际上 进程在终止时会发送 SIGCHLD 信号给父进程,而该 信号的默认处理动作是忽略,父进程可以对该信号进行自定义捕捉...,一旦进程退出就回收进程。   ...这样,通过信号处理就不需要父进程在将资源用在监视进程是否退出这件事上。但是这种代码却是一种错误的代码。   ...把子进程回收改为如上图所示,就解决了所有问题,无论是100个进程退出,还是100个只有50个进程退出,这样就都可正常将进程回收了。   文章到此结束,如果这篇文章对您有帮助的话还望三连~~

    8710

    Linux进程信号(上)

    那么,进程与人处理信号的方式有什么异同呢?信号又是如何产生的呢?本文我们来了解Linux中的进程信号。...2.系统调用 用键盘向前台进程发送信号,前台进程会影响shell,Linux规定跟shell交互时只允许有一个前台进程,实际上当我们运行自己的进程时,我们的进程就变成了前台进程,而sbash会被自动切到后台...<<endl; 18 sleep(1); 19 } 20 return 0; 21 } 通过上面的例子,我们可以知道:收到信号并不一定会引起进程退出...如果进程没有退出,则还有被调度的可能。...本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

    19520

    Linux进程间通信 信号

    作为一种进程间通信的基本形式,进程也可以给另一个进程发送信号。 --《linux系统编程》 ” 如上所述,信号可以实现进程间的通信。本章主要记录信号的使用方法。...如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被 取消时才被传递给进程。...当进程退出,或者进程终止时,发出这类信号。 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。...在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。 跟踪进程执行的信号。...SIG_TEST1, SignalHandler); signal(SIG_DEFAULT, SignalHandler); while(1); return 0; } 参考 《linux

    2.5K10
    领券