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

【Linux】 进程信号的发生

发送成功返回 1 反之返回 0。 还有 int raise(int sig); 系统调用是向当前进程发送指定信号。比较简单奥。 还有 void abort(void); 库函数异常终止当前进程。...异常进程非法操作的时候,OS会发送信号!让进程崩溃(默认是终止进程,也可以进行捕捉异常信号。推荐终止进程!) 接下来我们来看看一下kill系统调用 、 alarm系统调用 、 异常。...再来试试 int *p = nullptr; *p = 100; 也崩溃了,那么为什么程序会崩溃呢??? 因为程序非法访问,导致OS给进程发送信号,进程就崩溃了。...这也就是为什么推荐终止进程 — 释放进程的上下文数据,包括溢出标记位数据和其他异常数据!...core : 异常终止,但是会形成一个debug文件(默认在云服务器是关闭的) term : 直接异常终止 debug文件是什么,我们一起看看: 首先默认是不能创建的,我们要进行一个修改:

9110

Linux系统-进程控制

0,对父进程返回子进程的pid 写时拷贝 概念: fork成功之后父子代码共享,当父子不写入数据时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本 为什么数据要进行写时拷贝...: 进程具有独立性,多进程运行,需要独享各种资源,多进程运行期间互不干扰,不能让子进程的修改影响到父进程 为什么不在创建子进程的时候就进行数据的拷贝: 子进程不一定会使用父进程的所有数据,并且在子进程不对数据进行写入的情况下...,但这并不代表代码不能进行写时拷贝,例如在进行进程替换的时候,则需要进行代码的写时拷贝 示图: fork函数为什么要给子进程返回0,给父进程返回子进程的PID: 一个父进程可以创建多个子进程,而一个子进程只能有一个父进程...kill -9信号使得进程异常退出,或是使用Ctrl+C迫使进程退出 代码运行异常 如代码当中存在野指针问题等bug问题使得进程运行时异常退出 3、理解终止 以OS角度理解:核心思想-归还资源...> pid_t wait(int*status); 注意: wait函数作用的等待任意子进程 返回值:成功返回被等待进程pid,失败返回-1 参数:输出型参数,获取子进程退出状态,不关心则可以设置成为

1.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

Linux之进程控制

三、进程终止 1.进程终止的情况 代码运行完,并且结果正确; 代码运行完,结果不正确; 代码未运行完,进程异常结果无意义。...(甚至是kill -9都不能杀死这个进程,因为他已经死了)。...2.进程为什么要等待 1.父进程通过进程等待的方式回收子进程的资源; 2.父进程要获取子进程的退出信息 3.进程等待的方式 wait **参数:**输出型参数,一般设置为status,用于获取进程的退出状态...3.替换原理 为什么调用替换函数后,原程序的剩余部分不再执行?...因此,原进程后续的代码会被新进程的代码和数据所覆盖,因此就不会执行剩余代码了。 这也是为什么只有当程序替换失败才会有返回值,因为如果替换成功就不会执行接下来的代码,返回值就无意义。

17620

Linux进程控制

进程控制 fork函数 进程终止 退出码 常见的退出方式 进程等待 什么是进程等待,为什么进程等待 阻塞与非阻塞 进程替换 替换原理 替换函数 执行系统命令 执行自己写的程序 模拟实现简易的shell...进程终止 退出码 在写C/C++的时候,我们在main函数是程序的开始,但是最后一个位置会写return 0; 这也就代表一个程序的退出,至于为什么要写return 0,而不是返回其他的,亦或者是不写都可以...进程等待 什么是进程等待,为什么进程等待 之前说过僵尸进程会导致内存泄漏,因为他的资源无法回收,所以就需要等待子进程结束然后来保存资源给父进程,通过获取子进程退出信息知道是否成功退出。...waitpid 在举例之前首先说一下status: 一个程序终止有三种情况,代码运行完毕,结果正确和不正确,还有没运行完,出异常了。...一共有32个比特位,其中重要的只有16个比特位: 终止信号是一个进程异常了会受到终止信号,暂时用来判断进程是否正常退出。 退出状态是看结果是否正确。

2.9K00

【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

,你可以写个printf语句输出你想输出的错误信息,然后终止信号是0 ,表示僵尸进程正常退出。...下面是进程正常退出和进程异常终止时,终止信号和退出码的数值,我将退出码设置为10,用于检测status变量的正确性,另外当进程异常终止时,退出码失去意义,linux此时自动将退出码默认设置为0,但我们知道...,等待5秒 45} 11终止信号代表段错误,段错误就是地址错误,因为我们的代码中故意访问了野指针,所以进程异常退出,打印出进程异常退出的终止信号 8终止信号涵盖所有的算术错误,例如浮点异常等等...下面是进程异常终止的结果。 5.进程的阻塞和非阻塞等待(多次非阻塞等待 ⇒ 轮询) 1....这也就能解释为什么echo能够打印本地变量了,我们之前将echo理解为一个可执行程序,也就是shell的子进程,但是我们说子进程只能继承父进程的环境变量,而不能继承本地变量,所以当时就陷入echo为什么能够打印出本地变量的疑问当中

14.6K30

【Linux】进程控制:理解什么是进程创建,进程终止进程等待 | 进程替换

: 代码运行完毕,结果正确 代码运行完毕,结果不正确 代码异常终止异常退出本质是收到了对应的信号 进程退出的常用方法 return exit _exit 那么谁会关心一个进程的运行情况呢?...status不能简单的当作整形来看待,它有32个比特位,可以当作位图来看待,具体细节如下图(只研究status低16比特位): 低7位用来表示终止信号 第8位表示 core dump标志 第9位到第...:  (status>>8)&0xff 我们为什么要传一个输出型参数呢?...等待的原理: 其实子进程在退出的时候,会把退出码,终止信号写入到PCB的 exit_code  和  exit_signal 变量中,等待进程时,也就是从子进程的PCB中读取这两个变量的值,并写入到输出型变量...单进程进程替换 在理解什么是进程替换之前,我们先来看看进程替换怎么使用,下面是操作系统提供的进程替换的一些函数 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。

22410

【Linux】详解进程终止&&进程等待

当我们进程的代码和数据加载到内存并和进程地址空间建立映射关系时,如果数据的内容不允许被修改(比如说常量字符串),对应数据在页表中的映射条目的权限就会被设置为'r',表示该数据是只读的,不能被修改。...这就是为什么当我们要对常量字符串的内容做修改程序运行阶段会报错的底层原因。         通过页表的权限位,我们也可以很好地解释写时拷贝是如何做到的。...二、进程终止 main函数的返回值我们叫做进程的退出码。一般0表示进程执行成功,非0表示进程执行失败。可以用非0的数字表示进程失败的原因。...进程异常时,进程的退出码是没有意义的。 第三种情况进程异常进程收到了操作系统发出的异常信号,每个信号都有不同的编号,不同的信号编号表示异常的原因。...进程的退出信号是由操作系统发送给进程,以指示进程应该终止或进行某种操作的信号,是上对下的操作。

19010

Linux多线程

,另一方面也使线程的管理更为简单,而简单的东西就意味着稳定高效; 为什么说只创建一个PCB就可以实现对线程的创建:因为线程是进程内部的执行流,它的资源是从进程中得来的,而进程的资源则是通过地址空间和页表确定的...一个线程异常退出了,操作系统会向该进程对应的所有PCB发送信号,因为该进程中的所有线程的PID均相同,该信号线程人手一份,全部退出,同样的,进程也因为PID及信号的原因,退出。...线程没有异常的概念,异常进程考虑的事情,线程默认所有操作都是正确成功的,一旦有异常则整个进程直接退出 #include #include #include<...4、编程难度提高 ​ 编写与调试一个多线程程序比单线程程序困难得多。...exit的系统调用,这个不能用来终止线程,因为它会导致整个进程终止 a.线程执行的函数return就算终止 b.使用pthread_exit终止线程 void*start_routine(void*args

18330

Linux进程控制

进程退出的场景: 代码运行完毕,结果正确 代码运行完毕,结果不正确 代码异常终止 进程终止常见方法: 正常退出,可以在命令行中使用echo $?...查询退出码 从main函数中返回 在任何地方调用exit 在任何地址调用_exit 异常退出 使用Ctrl+Z组合键,终止进程 使用kill -9 命令杀死进程 exit函数 头文件:stdlib.h...功能:为退出程序的函数 用法: exit(1); 为异常退出 //只要括号内数字不为0都表示异常退出 exit(0); 为正常退出 注意:括号内的参数都将返回给操作系统...exit函数结束进程,删除进程使用的内存空间,并将进程的状态返回给操作系统(一般是用0表示正常终止,非0表示异常终止);return是结束函数的执行,将函数的执行信息传其他调用函数使用 非主函数中调用exit...status不能只简单的当做整型来看待,要当做位图来看(只研究status低16位),如图所示: 当进程正常终止时,终止信号为0,仅注意退出码会即可。 当程序中出现错误,如:除零错误,野指针问题。

8110

【Linux】进程信号(中)

,a/=0会报警 ---- 依旧可以生成可执行程序mysignal,但是运行可执行程序会报错 ---- 为什么除0就报错了呢?...---- 通过设置使进程不退出 把8进程默认方法变为自定义方法 ---- 再次运行可执行程序就会一直循环打印 ,只能通过其他信号终止进程 ---- 为什么会一直循环打印?...,发生段错误 ---- 为什么越界会使程序崩溃呢?...的文件 即核心转储文件 ---- Term:终止就是终止,没有多余动作 Core:终止,会先进行核心转储,在终止进程 核心转储的作用 方便异常后,进行调试 为了让代码从release变为debug,...sigprocmask(int how, const sigset_t *set, sigset_t *oset); 若操作成功返回0 ,否则返回-1 how和set都是输入型参数,oset为输出型参数

19030

Linux进程控制【创建、终止、等待】

假设某个进程陷入了死循环状态,可以通过特定方法终止程序,如在命令行中莫名其妙输入了一个指令,导致出现非正常情况,可以通过 ctrl + c 终止当前进程;对于自己写的程序,有多种终止方法,程序退出时...查看最近一次子进程运行的 退出码 退出码是给父进程看的,可以判断子进程是否成功运行 子进程运行情况: 运行失败或异常终止,此时出现终止信号,无退出码 运行成功,返回退出码,可能出现结果错误的情况...() 时,输出语句 使用 _exit() 时,并没有任何语句输出 原因: exit() 是对 _exit() 做的封装实现 _exit() 就只是单纯的退出程序 而 exit() 在退出之前还会做一些事...,比如冲刷缓冲区,再调用 _exit() 程序输出语句位于输出缓冲区,不冲刷的话,是不会输出内容的 ---- 3、进程等待 僵尸进程 是一个比较麻烦的问题,如果不对其做出处理,僵尸进程 就会越来越多...,父进程通过 等待轮询 的方式,在子进程执行的同时,执行其他任务 当然也可以通过 kill -9 PID 命令使子进程异常终止 可以看到程序能分别捕捉到正常和异常的情况 注意: 如果不写进程等待函数

25610

【Linux】开始掌握进程控制吧!

释放内核数据结构 但是task_struct会延期处理,因为终止进程处于Z状态(僵尸进程) 2.2 进程终止的情况 我们的main函数常常会有一个返回值 0 ,那为什么要返回零呢???...常见进程退出场景: 代码运行完毕,结果正确(正常结束进程) 代码运行完毕,结果不正确 代码异常终止,出现异常提前退出 就像:VS编程运行的时候,如果崩溃了 — 操作系统发现你的进程做了不应该做的事情,OS...一旦出现异常,退出码就没有意义了!!! 为什么异常才是最重要的!!! 那为什么会出现异常呢??? 原因是:进程出现异常的本质是进程收到来自OS发给进程的信号!...(kill -9 就是一个信号) 注意: 先确认是否异常 不是异常就是代码正常跑完,看退出码即可。 可以通过退出信号来判断出现了什么异常 2.3 如何终止 正常终止(可以通过 echo $?...查看进程退出码): 从main函数return,表示进程终止 调用exit _exit 异常退出: ctrl + c,信号终止 来看手册中如何描述的: 调用exit 函数试试: 1 #include

8810

Linux进程控制——Linux进程等待

前言:接着前面进程终止,话不多说我们进入Linux进程等待的学习,如果你还不了解进程终止建议先了解: Linux进程终止 本篇主要内容: 什么是进程等待 为什么要进行进程等待 如何进程等待...进程等待必要性 在了解完进程等待的概念后,新的问题出现了,我们为什么要进行进程等待,进程等待的必要性是什么?...进程等待的方法 3.1 wait方法 我们可以通过系统调用来等待进程:wait函数 wait等待任意一个子进程的退出,如果等待成功他将返回子进程的pid,失败则返回-1 我们就用一段代码来看看wait:...获取子进程status 父进程想要知道子进程的退出信息,也就是退出码和退出信号,就要用到输出型参数status wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充...获取退出结果 当我们的程序异常了,exit code 将无任何意义 exit sig : 0则代表没有收到信号 手动杀掉子进程也会获取到信号 但是如果我们每次提取退出信息都要使用繁琐的位运算,这很不方便

8110

Linux进程控制——Linux进程终止

我们主要介绍的Linux进程控制内容包括:进程终止进程等待与替换,进程程序替换! 本篇主要内容: 重识进程创建 进程退出场景 错误码和退出码 1....进程终止 进程退出场景: 代码运行完毕,结果正确 代码运行完毕,结果不正确 代码异常终止 前面二者都是正常退出,而最后则是异常退出 2.1 main的退出码 我们之前写代码中,main函数只能return...当我们的代码出异常了,也就是进程异常终止了,退出码还有意义吗?...第一种情况: Floating point exception 第二种情况: Segmentation fault 当然不止这两个情况,但是它们都会让程序进程异常终止!...其实一旦程序出现了异常,操作系统就是通过信号的方式来杀掉这个进程

8310

Java魔法堂:调用外部程序

即通过Runtime#exec调用外部程序时,外部程序的标准输出流和标准错误流已经被Java程序接管。那么在命令中企图通过>和>>实现输出重定向显然已无效果。 ?...另外,缓冲池的容量是一定的,因此若外部程序在运行过程中不断向缓冲池输出内容,当缓冲池填满,那么外部程序将暂停运行直到缓冲池有空位可接收外部程序输出内容为止。..."成功" : "失败"); } catch(Exception e){ e.printStackTrace(); } 注意:外部程序在执行结束后将会自动关闭,否则不管是字符流还是字节流均由于既读不到数据...// 如果超时前子进程结束,那么返回`true` ,否则返回`false` boolean waitFor(long timeout, TimeUnit unit) // 强行终止进程,但调用后子进程不会马上被终止...boolean isAlive() // 获取子进程异常输出流,如果子进程以`ProcessBuilder`创建,且通过`ProcessBuilder.redirectError`设置重定向,那么该方法返回

1.6K10

【Linux】进程控制

2、进程退出的情况 进程退出时一共有如下三种情景: 代码运行完毕且结果正确 – 此时退出码为0; 代码运行完毕且结果不正确 – 此时退出码为非0; 代码异常终止 – 此时退出码无意义。...3、进程退出的方法 进程退出有如下几种方法: main 函数 return 返回; 调用 exit 终止程序; 调用 _exit 终止程序。...上面三种进程退出的方法都是正常退出,但除了正常退出,进程也会异常退出,比如 Ctrl C 终止进程,或者程序中遇到除0,野指针,空指针解引用等问题: ---- 三、进程等待 1、为什么要进行进程等待...sys/wait.h 函数原型:pid_t wait(int *status); status:输出型参数,获取子进程退出状态,不关心则可以设置成为NULL; 返回值:成功返回被等待进程的...,最后一位表示 core dump 标志;第二个字节表示退出状态,退出状态即代表进程退出时的退出码; 对于正常退出的程序来说,退出信号和 core dump 标志都为0,退出状态等于退出码;对于异常终止程序来说

4K00

Linux进程信号(产生、保存、处理)可重入函数概念volatile理解SIGCHLD信号

就跟程序异常一样,抛异常的原因有很多种,但是最终结果都是让程序终止。因此,我们加下了分析信号产生的另一种情况:硬件异常产生信号。...那为什么除0就会使进程终止了呢? 当除0的时候,进程会收到来自操作系统的信号,这个信号是8号信号,SIGFPE。...②是除0的进程导致的。于是向这个进程发送8号信号去终止这个进程! 解决了上面的第二个问题,再来看看第一个问题,为什么只执行一次除0操作,信号却一直被自定义处理。...当访问0号地址的时候,就是越界访问的时候,MMU就会发生异常,此时操作系统就会立马将这个异常接受,并且发送11号信号给进程,使得进程终止!...总结硬件异常从而产生信号:硬件异常是因为进程的不恰当操作,导致进程调度的CPU异常,操作系统通过这个异常情况给调度CPU的进程发送终止信号。

1.4K10

探索进程控制第一弹(进程终止进程等待)

进程为什么知道子进程退出码?父进程要知道子进程的退出情况(失败了还是成功了,失败的原因是什么),bash会反馈给用户。...代码异常终止 代码执行时,出现了异常,提前退出,一旦进程出现异常,退出码有没有意义了 vs编写程序运行时,程序崩溃了,本质是操作系统发现你的程序做了不该做的事情,操作系统杀掉了你的进程。...为什么进程会出现异常? 本质上是因为进程收到了操作系统发出的信号。 段错误,操作系统提前终止进程。 尽管书写的代码进程没有错误,但是接收到了信号,就会有段错误。...进程退出时,我们可以看进程退出信号是多少来判断进程为什么异常。...进程退出的三种情况: 代码运行完毕,结果正确 代码运行完毕,结果不正确 代码异常终止 因此,衡量一个进程退出,我们只需要看两个数字:退出码、退出信号 如何终止 main函数中直接return,表示进程终止

11810

C++『异常

: 返回错误码 终止进程 比如 main 函数有一个返回值,只有返回值(错误码)为 0 时才表示程序正常退出,如果发生越界访问、堆栈溢出等行为时,会返回其他数值 部分错误码及其对应的错误信息对照表格如下...,C语言 还支持通过函数终止进程,说白了就是给进程发送 信号 可以使用 exit(err_code)、abord()、assert(bool_exp) 等函数终止进程 exit(err_code) 支持在终止进程时设置错误码...,对于程序调试十分友好,需要 注意 的是 assert 只能在 Debug 模式下使用,Release 模式中 assert 会被自动删除 1.2.C++异常处理方式 无论是 错误码 还是 终止进程,都只能提供简略的错误信息...答案是会的,会直接被 abort 函数终止进程,所以可以放心使用 noexcept 关键字;即便是在异常抛出与异常捕获的中间函数中使用 noexcept 修饰,在异常抛出后,进程也会被终止;总之就是加了...,就属于自定义异常体系 为什么要自定义异常体系?

17210
领券