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

等待进程的那些事儿

,在 SIGCHLD 信号处理器中调用 wait 等待已结束的进程,回收进程信息,防止产生僵尸进程 (zombie)。...例如 bash,它除了在主线程中同步等待前台正在运行的进程,还必需在信号处理器中异步接收后台运行进程的状态反馈,这样就不得不混合使用 wait。...,第一个休眠 3 秒后退出,第二个休眠 4 秒后退出,由于父进程同步等待的是第二个进程,因此第二个进程模拟前台进程,第一个进程模拟后台进程。...因为 waitpid 是指定进程等待的,所以即使还有其它进程存在,这个也会返回错误,不会卡死在那里。...在处理器中也应使用 waitpid 等待进程,如返回 ECHILD 错误,证明该进程是前台进程,已经被同步 wait 掉了,不需要任何处理;否则作为后台进程处理。

2.3K30

C语言Linux系统编程-等待终止的进程(僵死进程

1.等待终止的进程(僵死进程): 如果一个进程在父进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程 当父进程获取了进程的信息后,进程才会消失。...pid_t wait(int *status); 父进程调用这个方法会被阻塞住,如果子进程终止的时候,此方法会调用并且返回终止进程的pid #include #include <unistd.h...sleep(2); pid=getpid(); ppid=getppid(); printf("我是进程...,pid=22315 , ppid=12479 ,我新建的进程pid=22316 我是进程,pid=22316 , ppid=22315 我的进程,pid=22316,终止了 2.如果父进程进程之前终止了...,那么系统会把子进程设置给init进程(pid为1),init进程会周期性的等待所有的进程,确保没有长时间的僵死进程

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

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

三、进程等待 3.1、进程等待的必要性 1、之前讲过,进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...4、父进程通过进程等待(wait)的方式,回收进程资源,获取进程退出信息  3.2、进程等待的方法 3.2.1、wait方法 wait方法里的参数为输出型参数,可以设置为NULL。...调用wait函数父进程默认进行阻塞等待,会等待任意一个进程退出。等待成功,wait会返回进程的pid,等待失败返回小于0的值。 ...采用非阻塞的方法等待进程退出成功返回进程的pid,进程还在继续自己的工作返回0,进程出错返回小于0的数。...阻塞等待时父进程会阻塞在waitpid这里一直等待进程返回,非阻塞等待采用轮询的方法查看进程的退出信息,在轮询的间隙父进程可以继续做别的工作。

10910

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

僵尸进程 是一个比较麻烦的问题,如果不对其做出处理,僵尸进程 就会越来越多,导致 内存泄漏 和 标识符 占用问题 3.1、等待原因 进程运行结束后,父进程没有等待并接收其退出码和退出状态,OS 无法释放对应的...,确保进程不会连累 OS,而进程执行的结果是否正确,需要我们自行判断 3.2、等待函数 系统提供的父进程等待函数有两个 wait() 和 waitpid(),后者比较常用 #include <sys...//比如 waitpid(id, &status, WNOHANG); 父进程并非需要一直等待进程运行结束(阻塞等待),可以通过设置 options 参数,进程解除 夯 状态,父进程变成 等待轮询 状态...等待轮询 的方式,在进程执行的同时,执行其他任务 当然也可以通过 kill -9 PID 命令使进程异常终止 可以看到程序能分别捕捉到正常和异常的情况 注意: 如果不写进程等待函数,会引发僵尸进程问题...---- 总结 以上就是关于 Linux进程控制(创建、终止、等待) 的相关知识了,我们学习了 进程 是如何被创建的,创建后又是如何终止的,以及 进程 终止 父进程 需要做些什么,有了这些知识后,

21110

Linux进程控制(创建、终止、等待)

环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【Linux】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux进程理解与学习Ⅰ-进程概念...【Linux进程理解与学习Ⅱ-进程状态 【Linux进程理解与学习Ⅲ-环境变量 【Linux进程理解与学习Ⅳ-进程地址空间 浅谈Linux下的shell--BASH 【Linux进程优先级...总而言之,进程等待的目的只有两个,如下: 解决僵尸进程问题,避免内存泄漏(必须要做的) 获取进程的退出结果(如果需要的话) 进程等待的方法 那么父进程应如何等待呢?...(1); } if(cnt == 0)exit(111); else exit(-1); } //父进程等待进程退出(阻塞式等待) printf("我开始等待进程退出...我们可以通过等待轮询的方式,来保证在等待进程的同时,父进程得以做一些其他的事。

3.4K40

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

我们知道子进程在退出时会变成僵尸进程: 僵尸进程无法被杀死,需要通过进程等待来杀掉它,进而解决内存泄漏问题---必须解决的 我们要通过进程等待,获得进程的退出情况---知道我布置给进程的任务,它完成的怎么样了...pid>0,等待进程ID与pid相等的进程。 status:  WIFEXITED(status): 若为正常终止进程返回的状态,则为真。...(查看进程的退出码) options:   WNOHANG: 若pid指定的进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该进程的ID。...int exit_code; int exit_signal; 阻塞等待 waitpid的第三个参数 options 为0时,表示当进程一直没有退出的时候,父进程处于阻塞等待。 什么是阻塞等待?...即父进程会检查一次看进程有没有退出,没有则返回0,此时父进程可以做一些自己的事,而不是一味的等待进程的退出,在进程退出前循环以上的过程,直到进程退出,返回 >0 的一个数,返回负数则表示等待失败

16610

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

三、进程等待(回收进程所有资源,读取进程退出信息) 1.wait(等待任意的进程,只能是阻塞等待) 1....解决僵尸进程,可以让父进程通过进程等待的方式,回收进程剩余资源(PCB,内核栈等),获取进程退出信息,父进程需要知道子进程的退出码和执行时间等信息,形象化的比喻就是父进程通过进程等待来给僵尸进程收尸...3.waitpid(可以等待特定的进程,可以非阻塞等待) 1. waitpid可以获取进程退出结果,并且回收僵尸进程剩余资源。 2....当进程还没有死的时候,也就是没有退出的时候,父进程调用的wait或waitpit需要等待进程退出,系统调用接口也不返回,这段时间父进程什么都没做,就一直等待进程退出,这样的等待方式,称之为阻塞式等待...如果等待进程状态没有发生变化,则waitpid会返回0值。多次非阻塞等待进程,直到进程退出,这样的等待方式又称之为轮询。如果等待进程不是当前父进程进程,则waitpid会调用失败。

14.4K30

Linux系统进程编程之回收进程(三)

那么说了这么多,我们该怎么样来回收Linux系统的僵尸进程呢?...---pid > 0 等待进程I D与p i d相等的进程。 ---pid == 0 等待其组I D等于调用进程的组I D的任一进程。换句话说是与调用 者进程同在一个组的进程。...的进程而是回收任意一个进程,0表示用默认的方式(阻塞式)来进行等待,返回值ret是本次回收的进程的PID */ /* 等待回收PID为pid的这个子进程,如果当前进程并没有一个ID号为...此时如果父进程执行waitpid时进程已经先结束等待回收则waitpid直接回收成功,返回值是回收的进程的PID; 如果父进程waitpid时进程尚未结束则父进程立刻返回(非阻塞),但是返回值为...---waitpid并不等待第一个终止的进程—它有若干个选择项,可以控----制它所等待的特定进程。 ---实际上wait函数是waitpid函数的一个特例。

3.2K20

Linux修炼】11.进程的创建、终止、等待、程序替换

linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程进程,而原进程为父进程。...如,进程运行完成,结果对还是不对,或者是否正常退出。 父进程通过进程等待的方式,回收进程资源,获取进程退出信息 总结:进程为什么要等待?...回收进程资源,获取进程退出信息,即通过进程等待的方式解决僵尸进程的问题。 3.2 进程等待的方法 1....即我们可以总结成一张图: 上述的过程我们也再总结一下: 让OS释放进程的僵尸状态 获取进程的退出结果(如果子进程不结束,父进程就会一直处于阻塞等待等待进程退出) 2....因此这里我们再来回顾一下: 进程等待是什么? 通过系统调用,让父进程等待进程的一种方式。 进程为什么要等待? 答:释放进程僵尸,获取进程状态。

6.1K00

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

L010Linux和androidNDK之linux避免僵尸进程进程退出的处理 如果你在程序中fork出一个进程,没有好好处理进程退出后的相关事宜,那么就有可能召唤出传说中进程界的僵尸---僵尸进程...,并不能将其完全销毁) 僵尸进程是怎么样产生 在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集...如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,...参数 pid 为欲等待进程识别码, 其他数值意义如下: pid<-1 等待进程组识别码为 pid 绝对值的任何进程。 pid=-1 等待任何进程,相当于 wait()。...pid=0 等待进程组识别码与目前进程相同的任何进程。 pid>0 等待任何进程识别码为 pid 的进程

3.1K40

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

进程创建 初识fork函数 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程进程,而原进程为父进程。...例如,父进程等待客户端请求,生成进程来处理请求。 一个进程要执行一个不同的程序。...父进程通过等待,解决进程退出的僵尸问题,回收系统资源(一定要考虑的) 父进程获取进程的退出信息,知道子进程退出原因(可选的功能) 进程等待方法 wait方法 #include<sys/types.h...由此可以看出,等待会解决进程的僵尸问题。 将上述代码sleep(10)代码注释掉,进程运行5秒后直接退出,立马执行父进程等待。如果子进程没有退,其实父进程一直在阻塞等待。...进程本身是软件,父进程本质是在等待某种软件就绪。 进程等待本质是将进程的PCB列入等待队列。那么如何理解父进程阻塞等待进程

9510

探索父进程进程

进程进程 这个父进程PID到底是什么?...结论:当我们在命令行输入指令去执行的时候,bash会帮助我们创建一个进程去执行该指令。进程出问题不会影响到父进程。...先来认识一下fork函数: fork函数会以调用该函数的进程作为父进程创建一个进程 创建成功时,会在父进程中返回进程的PID,在进程中返回0;如果失败,在父进程中返回-1,没有进程创建。...一个父进程可以创建多个子进程,为了区分这些进程,fork函数在创建进程后,会给父进程返回进程的pid。进程只需调用getppid()函数即可找到父进程。...进程可以把父进程的数据全被拷贝一份,但是大部分数据对于进程来说可能都是没用的,这就造成了浪费,所以操作系统只是把父进程中数据层面的代码临时拷贝一份给进程,即进程创建后,会共享父进程的代码和数据,

7510

Linux 创建进程执行任务的实现方法

Linux 操作系统紧紧依赖进程创建来满足用户的需求。例如,只要用户输入一条命令,shell 进程就创建一个新进程,新进程运行 shell 的另一个拷贝并执行用户输入的命令。...Linux 系统中通过 fork/vfork 系统调用来创建新进程。本文将介绍如何使用 fork/vfork 系统调用来创建新进程并使用 exec 族函数在新进程中执行任务。...通常将原有的进程称为父进程,把新创建的进程称为进程进程是父进程的一个拷贝,进程获得同父进程相同的数据,但是同父进程使用不同的数据段和堆栈段。...总结 fork/vfork 函数和 exec 族函数都是 Linux 系统中非常重要的概念。...本文试图通过简单的 demo 来演示这些函数的基本用法,为理解 Linux 系统中父进程进程的概念提供一些直观的感受。

3.7K11

故障分析 | MySQL锁等待超时一例分析

---1、问题现象开发反馈某业务持续性报锁等待超时,相关错误信息如下:Lock wait timeout exceeded; try restarting transaction为了能精确定位问题,继续询问开发有没有锁等待超时相关...SQL,开发又给了相关报错SQL:INSERT INTO VALUES(...)2、分析诊断根据错误信息得知,单条insert语句锁等待超时,如果都是单条insert插入,不应该频繁报锁超时...,似乎有点不寻常,当前数据库版本为5.6,锁等待超时参数设置时长30秒:root@ (none)> show variables like 'innodb_lock_wait_timeout';+---...| 1 |+--------------------------+-------+innodb_autoinc_lock_mode=1,对于批量插入语句,需要等到语句执行结束才释放自增锁,故要解决锁等待超时...;+----------+| count(*) |+----------+| 23 |+----------+1 row in set (0.65 sec)执行时间短了,自然就不存在自增锁等待超时

64930
领券