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

等待子进程的那些事儿

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

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

    Python多任务编程——进程等待

    进程等待目的: 主进程会等待所有的子进程执行完成以后再退出。...目标: 主进程退出同时销毁子进程 解决方法: 1.把子进程设置成为守护主进程,主进程退出子进程直接销毁 通过sub_process.daemon = True实现 import multiprocessing...time.sleep(1) # 标准python写法,直接执行的模块,需要加上判断是否是主模块的代码 if __name__ == '__main__': # 创建子进程...sub_process = multiprocessing.Process(target=task) # 把子进程设置成为守护主进程,以后主进程退出子进程直接销毁 sub_process.daemon...time.sleep(1) # 标准python写法,直接执行的模块,需要加上判断是否是主模块的代码 if __name__ == '__main__': # 创建子进程 sub_process

    30.3K76

    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.5K20

    subprocess:Python中创建子进程

    前言 subprocess库提供了一个API创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据。...本篇,将详细介绍Python创建附加进行的库:subprocess。 run(运行外部命令) subprocess库本身可以替换os.system(),os.spawnv()等函数。...print(completed.returncode) 这里我们运行了一个windows系统常用的whoami命令,返回当前用户的名称,输出如下: 这里,我们使用了subprocess.run调用了子进程运行...returncode为子进程的退出状态码。通常情况下,退出状态码为0则表示进程成功运行了;一个负值-N表示这个子进程被信号N终止了。...) result = proc2.stdout for line in result: print(line.decode('utf-8').strip()) sys的命令交互 在我们学习Python

    54670

    Python标准库06 子进程 (subprocess包)

    在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序(fork,exec见Linux进程基础)。...使用subprocess包中的函数创建子进程的时候,要注意: 1) 在创建子进程之后,父进程是否暂停,并等待子进程运行。 2) 函数返回什么 3) 当returncode不为0时,父进程如何处理。...subprocess.call() 父进程等待子进程完成 返回退出信息(returncode,相当于exit code,见Linux进程基础) subprocess.check_call() 父进程等待子进程完成...subprocess.check_output() 父进程等待子进程完成 返回子进程向标准输出的输出结果 检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError...这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。 与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。

    2.8K60

    Python基础16-正则和子进程模块

    (在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。...")) print(re.match("hello"," world hello python")) print(re.split("hello","world hello python",maxsplit...\|",src)) subprocess模块 ---- subprocess模块介绍 sub 子 process 进程 什么是进程 正在进行中的程序...每当打开一个程序就会开启一个进程 每个进程包含运行程序所需的所有资源 正常情况下 不可以跨进程访问数据 但是有些情况就需要访问别的进程数据 提供一个叫做管道的对象...subprocess的好处是可以获取指令的执行结果 subprocess执行指令时 可以在子进程中 这样避免造成主进程卡死 注意 管道的read方法和文件的read有相同的问题

    1.2K50

    如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?

    问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!.../bin/bash for i in `seq 0 9`; do calculations $i & done wait 上述脚本将会等待所有 10 个被创建的子进程结束,但它总会给出退出状态 0...我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1?.../usr/bin/env bash # 这是一个特殊的 sleep 函数,它将睡眠的秒数作为"错误代码" # 或"返回代码"返回,以便我们可以清楚地看到,实际上 # 我们在每个进程完成时确实获取了它的返回代码...]} & # 将 cmd 作为子进程运行 pids+=("$!")

    11500

    Python程序中创建子进程时对环境变量的要求

    首先,来看下面一段代码,在主进程中重新为os.environ赋值,但在子进程中并不会起作用,子进程中使用的仍是系统的全部环境变量。 ? 运行结果: ?...在Python中,为变量重新赋值实际上是修改了变量的引用,这适用于任意类型的变量。对于列表、字典、集合以及类似的可变类型对象,可以通过一定形式改变其中元素的引用而不改变整个对象的引用。...在主进程中清空了所有环境变量,然后创建子进程失败并引发了异常。...以Windows操作系统为例,创建子进程时会调用API函数CreateProcessA,该函数要求环境变量至少要包含SYSTEMROOT,否则调用另一个函数CryptAcquireContext时会失败

    2.3K30

    如何编写bash脚本以便在进程死机时重新启动进程

    bash脚本来检查它是否正在运行,如果没有,则启动它。...我将从crontab中调用它: # crontab */5 * * * * /path/to/keepalivescript.sh 答: 避免使用 PID 文件、cron 或其他任何试图评估不属于其子进程的进程...在UNIX中,有充分的理由只能等待子进程。任何试图解决这个问题的方法(ps解析、pgrep、存储PID等)都是有缺陷的,其中存在漏洞。待后文分析。...假设你的进程名为procA,监控它的进程名为procB,则需要procB成为procA的父进程。因为只有启动你的进程的进程才能可靠地等待它结束。而这在Bash中很容易实现。...Restart..." >&2 sleep 1 done 上面的bash代码在一个until循环中运行procA。第一行启动procA并等待它结束。当它结束时,until检查其退出状态。

    19220

    软件性能测试(连载6)

    通常出现在I/O阻塞 R 运行态 running or runnable 表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。...而处于可运行状态R状态的进程又包括正在使用 CPU进程和正在等待CPU的进程,不可中断状态的D 状态(Disk Sleep)进程即正处于等待I/O的进程。...看一下正常父进程创建子进程,子进程结束后父进程收回的流程。 (1)父进程创建子进程。 (2)父进程调用wait()或者waitpid()等待子进程结束。...如果父进程在创建子进程后没有调用wait()或者waitpid()等待子进程结束或者子进程结束后没有给父进程发SIGCHLD 信号就造成僵尸进程,如下代码。...└─bash,3782 └─python3,3783 manage.py runserver 0.0.0.0:8000 --insecure └─python3,3785 manage.py runserver

    88420

    100个Linux命令(7)-进程管理

    [进程状态间转换] 运行态:进程正在运行,即 cpu 在正在它上 就绪(等待)态:进程可以运行,已经处于等待队列中,也就是调度类下次可能会选中它 随眠(阻塞)态:进程随眠,不可运行 各状态之间的转换方式...: 新状态-->就绪态:当等待队列允许接纳新进程时,内核便把新进程移入等待队列 就绪态-->运行态:调度类选中等待队列中的某个进程,该进程进入运行态 运行态-->睡眠态:正在运行的进程因需要等待某事件(...如IO等待、信号等待等)的出现而无法执行,进入睡眠态 睡眠态-->就绪态:程所等待的事件发生了,进程就从睡眠态排入等待队列,等待下次被选中执行 运行态-->就绪态:正在执行的进程因时间片用完而被暂停执行...在当前bash环境下,处于可运行状态(即就绪态)时,当执行cp命令时,首先fork出一个bash子进程,然后在子bash上exec加载cp程序,cp子进程进入等待队列,由于在命令行下敲的命令,所以优先级较高...在cp这个子进程执行过程中,父进程bash会进入睡眠状态(不仅是因为cpu只有一颗的情况下一次只能执行一个进程,还因为进程等待),并等待被唤醒,此刻bash无法和人类交互。

    1.7K20
    领券