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

wait() 回收进程

在前面的文章中我们讨论了如何通过 fork() 函数创建进程,创建后的进程如果优先于父进程退出,进程的虚拟内存空间就消失了,但是进程控制块PCB并没有消失,这里面包含了这个子进程的退出状态,需要由父进程来进行回收...在父进程回收之前,这个进程被称为僵尸进程(僵死进程),任何一个进程都会经过这段僵尸进程的阶段,最后由父进程来回收。...5秒 sleep(5); } else if (pid > 0) { // 父进程调用wait函数处于阻塞状态,直到进程结束wait才会返回...() 的应用了,这样的 wait() 只起到了回收进程 PCB 的作用,而并没有对子进程的退出消息做任何的接收或处理。...而WIFSIGNALED则是判断进程是否是接收到了某个信号,如果是收到了某个信号证明进程是非正常退出的,那么使用WTERMSIG获取收到的信号。可通过 kill -l 查看信号编号的对应内容。

17430

Linux & + wait进程并发编程

近期优化一个 shell 脚本,通过 shell 多进程并发极大提升了效率,抽象出核心代码记录一下 一些注意点,直接注释在代码中,有什么疑问可以评论沟通 :) #!.../bin/bash # 运行方式 # bash test.sh # 查看多进程,运行的过程 # watch -d -n 1 'ps aux | grep test.sh | grep -v grep...' date pid=$$ # 多进程并发处理 for i in `seq 1 5` # 迭代 5 次,模拟 5 个并发进程 do { echo 'hello ' >/dev/null #...status"${i} # 处理结果保存在 /dev/shm 共享内存(即 tmpfs),基于内存的临时文件系统 sleep 3 } & # & 语句丢到后台,继续下个迭代,实现并发 done wait...# 等待所有后台子进程结束 # 串行检测,多进程处理结果 flag="success" for i in `seq 1 5` do { if [[ `cat /dev/shm/${pid}"

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

Linux僵尸进程以及wait函数

Linux下使用top命令可以查看当前进程数目,以及进程的状态。例如: 可以看到我的系统暂时并没有僵尸进程(zombie) 。挂起的进程倒是一大堆。...僵尸进程产生的原因:每个Linux进程进程表中都有一个进入点,内核执行该进程时,使用到的一切信息都存入在进程点。我们可以使用ps命令来查看进程状态。...但是进程的回收仍旧需要父进程来做,好处是不用使用wait()来挂起了,父进程可以忙自己的。 使用wait函数和waitpid函数。...wait函数:需要头文件#include 函数原型:pid_t wait(int *status); 函数功能:阻塞(睡眠)进程,等待进程结束,负责为进程回收资源。...参数是接收进程退出状态,返回值是进程的PID,出错为-1。 如果父进程有多个子进程,那么当其中某一个进程终止的时候,wait函数就会立即回收该进程,并且返回。

1.6K10

Linux孤儿进程和僵尸进程详解(wait和watipid)

*wstatus, int options);        对于wait函数,父进程调用该函数的时候,如果子进程还没有运行结束,那么父进程就会阻塞在这里,直到有进程结束变为僵尸进程后,会获取进程的退出信息...如果成功wait函数会返回进程的pid,如果当前进程没有进程,就会失败,返回-1并设置errno为ECHILD。        ...当pid = -1时,等待任何一个进程退出,那么此时的waitpid函数和wait函数的作用相同。         3. 当pid = 0时,等待和父进程相同进程组中的任何进程。        ...waitpid有wait没有的三个功能: 1. waitpid能等待一个特定的进程,而wait只能等待任意的进程。 2....系统一旦调用wait函数就会阻塞父进程来等待,直到进程的退出才停止阻塞,而waitpid提供了非阻塞方式的等待,也就是          WNOHANG参数。

3.3K21

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

那么说了这么多,我们该怎么样来回收Linux系统的僵尸进程呢?...来,让我们下面细说: 一、第一招:使用wait()函数来回收: 1、我们先来看这个函数的原型和它所包含的头文件(在Linux系统下,使用man 手册来查看它的具体用法:man 2 wait):...wstatus用来返回进程结束时的状态,父进程通过wait得到wstatus后就可以知道子进程的一些结束状态信息。...返回值是进程的ID,当前父进程有可能有多个子进程wait函数阻塞直到其中一个进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个进程本次被回收了: wait(): on success...\n"); ret = wait(&wstatus); printf("进程已经被回收,进程pid = %d.

3.2K20

Linux进程概念(二.查看进程、父进程进程进程状态详解)

ps 是一个常用的 Unix/Linux 命令,用于显示当前系统中运行的进程信息。...在 Linux 中,每个进程都属于一个或多个组,getgid() 函数返回调用进程的有效组 ID。...1.4通过 /proc 系统文件夹看进程Linux系统中,/proc文件系统提供了关于运行中进程的详细信息。你可以通过查看/proc文件系统中的特定目录和文件来获取有关进程的信息。...在Unix/Linux系统中,可以使用 getpid() 系统调用来获取当前进程的PID,使用 getppid() 系统调用来获取当前进程的父进程的PID。...3.3Linux中状态初步认识 一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)进程的状态通常由几个不同的状态标识符表示。

23210

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

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

3.1K40

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

1.等待终止的进程(僵死进程): 如果一个进程在父进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程 当父进程获取了进程的信息后,进程才会消失。...pid_t wait(int *status); 父进程调用这个方法会被阻塞住,如果子进程终止的时候,此方法会调用并且返回终止进程的pid #include #include #include int main(){ int pid,ppid; int ret=fork(); if(ret>0){...ppid=%d ,我新建的进程pid=%d\n",pid,ppid,ret); int status; int sonPid=wait...,pid=22315 , ppid=12479 ,我新建的进程pid=22316 我是进程,pid=22316 , ppid=22315 我的进程,pid=22316,终止了 2.如果父进程进程之前终止了

3.4K20

探索父进程进程

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

7910

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

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

3.7K11

进程进程谁先运行?

Linux中,父进程进程是并行运行的,先运行哪个是不确定的,在小红帽系统(Red Hat)中,先运行的是进程,在ubuntu系统中,父进程是先运行的。...其实谁先运行不重要了,一般在编程中,把父进程当做守护进程使用,用一个waitpid(pid,&status,0) != pid 等待进程的结束,父进程一直阻塞在这个函数中。...() { pid_t pid, pid_wait; int status; pid = fork(); // 创建进程 if (-1==pid) { // 检查是否创建成功...Child process ID: %d\n", pid); pid_wait = waitpid(pid, &status, 0); // 等待指定进程号的进程 printf("Child...\n", pid_wait); } return 0; } 结果(Ubuntu中):父进程等待了进程结束 ? 如果喜欢我的文章,欢迎关注、点赞和转发,下面可以留言~~~

3.7K30

Linux TCP通信出现CLOSE_WAIT后导致服务端进程挂掉

在前文中讲述了Linux服务端TCP通信出现CLOSE_WAIT状态的原因,这篇文章主要通过一个实例演示它个一个“恶劣”影响:直接使服务端进程Down掉。...这时Linux服务端进程会执行第90行处的close()函数,也即执行正常四次挥手关闭TCP连接。...接着Linux服务端进程继续从内核中已完成连接队列中取出已完成连接,这样之前小节3中Windows telnet建立的客户端连接被读取。...可以发现在Linux telnet客户端完成四次挥手后,服务端进程继续向之前Windows telnet客户端建立的socket描述符发送26字节的报文数据。...因为Windows客户端此时处于FIN_WAIT2状态(Linux服务端处于CLOSE_WAIT状态),所以服务端能继续发其发送数据(即图中的PUSH+ACK报文),接着Windows客户端回应RST+

8610

孤儿进程和僵尸进程的概念及进程回收(wait函数及waitpid函数)

一.孤儿进程 孤儿进程可以理解为一个进程的父进程英年早逝(父进程先于进程退出),就将这样的一个进程称为孤儿进程,在linux操作系统上。...调用一次,只能回收一个进程,如果回收多个子进程,就需要多次调用wait函数。 函数功能: (1)阻塞并等待进程退出。 (2)回收进程残留资源。.../*wait函数是阻塞函数,会等到进程结束回收资源*/ pid_t dpid = wait(NULL);//对子进程的退出状态不关心 printf("...进程被编号为9的信号杀死。 (3)waitpid系统调用函数 函数功能:和wait函数相同。...参数: 1.pid 可以有选择的回收 (1)pid:pid == -1,等待任意进程,与wait等效。 (2)pid > 0,等待其进程ID与pid相等的进程

84420

Linux--fork与wait

fork与exec 在Linux中,都是通过fork与vfork系统调用来创建进程,并且在fork完之后,通常会调用exec命令簇来替换代码段,执行不同的任务。...当结果返回小于0时,则代表创建进程失败 当结果为0时,则代表进程开始执行 当结果大于0时,返回值则代表进程的pid,父进程继续执行 wait与waitpid wait允许父进程获取进程结束时的状态...wait的函数原型如下: #include #include int wait(int *status) 如果父进程没有调用wait获取进程状态时,进程会销毁...如果对于进程的状态改变不是很关心的话,也可以注册SIGCHILD信号,当进程状态改变时候,内核会发送该信号给父进程,让父进程接收进程状态,可以在该信号处理函数中调用wait()来接收进程状态,并且让进程可以安心改变状态...等待进程都结束 如果需要等待进程都结束,则需要在fork完进程后,为每个创建的进程调用waitpid来等待所有进程都结束 Android中的fork与wait Android中Runtime.getRuntime

2.5K30

Linux wait() 和 waitpid()函数介绍

现在要知道调用wait或waitpid的进程可能会发生什么情况:  如果其所有进程都在运行,则阻塞。 如果一个进程已经终止,正在得带的父进程获取到终止状态,则取得该进程的终止状态立即返回。...如果他没有任何进程,则立即出错返回。 如果进程由于接收到SIGCHLD信号而调用wait,则可期望wait会立即返回。但是如果在任意时刻调用wait进程可能会阻塞。...也就是父进程等待进程的结束。父进程才能扑捉进程,然后得到wait要得到的结果。 参数status: 参数status是一个整型指针。...与wait等效。 Pid>0.等待其进程ID与pid相等的进程。 Pid==0等待其组ID等于调用进程组ID的任一个进程。 Pid<-1等待其组ID等于pid绝对值的任一进程。...Waitpid返回终止进程进程ID。并将该进程的终止状态存放在有status指向的存储单元中。 Waitpid 函数提供了wait函数没有提供的三个功能。

2.2K50
领券