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

Unix上子进程是否在C中无阻塞终止

在Unix上,子进程是否在C中无阻塞终止取决于父进程是否设置了合适的信号处理函数。当子进程终止时,它会向父进程发送一个SIGCHLD信号,父进程可以通过捕捉该信号并调用适当的处理函数来处理子进程的终止状态。

如果父进程没有设置SIGCHLD信号的处理函数,子进程将成为"僵尸进程",即子进程已经终止但父进程尚未处理其终止状态。僵尸进程会占用系统资源,并且如果父进程终止而没有处理僵尸进程,它们将被init进程接管。

为了避免僵尸进程的产生,父进程可以通过以下方式之一来处理SIGCHLD信号:

  1. 忽略信号:父进程可以通过调用signal(SIGCHLD, SIG_IGN)来忽略SIGCHLD信号。这样子进程终止时,内核会自动回收子进程的资源,父进程不需要显式处理。
  2. 捕捉信号并处理:父进程可以通过调用signal(SIGCHLD, handler)来捕捉SIGCHLD信号,并在处理函数handler中调用wait()waitpid()来等待子进程的终止状态。这样父进程可以在子进程终止时获取其终止状态,并进行相应的处理。

需要注意的是,如果父进程在处理SIGCHLD信号时阻塞了其他信号,可能会导致子进程的终止状态无法及时处理,从而产生僵尸进程。因此,在处理SIGCHLD信号时,最好使用sigaction()函数来设置信号处理函数,并使用SA_NOCLDSTOP标志来防止子进程暂停时发送SIGCHLD信号。

总结起来,子进程在C中是否无阻塞终止取决于父进程是否设置了合适的信号处理函数来处理SIGCHLD信号。如果父进程忽略或捕捉并处理了SIGCHLD信号,子进程将在终止时被正确回收,不会产生僵尸进程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python 标准类库-并行执行之subprocess-进程管理

因为不是从当前进程读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞进程。...因为不是从当前进程读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞进程。...因为不是从当前进程读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞进程。...类似Unix使用os.execvp(),Windows使用CreateProcess()函数。 args 参数值为字符串、序列。默认的,如果args是个序列,程序会执行args第一项。...如果进程timeout(单位 秒)之后依然没终止,则抛出TimeoutExpired 异常,(Python3.3.2发丝。捕获该异常并重试comunicate,不会丢失任何输出。

4.1K20

unix环境高级编程()-进程

: 快速适配quick-fit: 改善了标准malloc的最佳适配或首次适配分配策略 alloca:分配空间,而不是堆上。...id为1的进程通常是init进程,是普通进程。以超级用户运行。文件为/sbin/init。负责自举内核后启动unix系统。...取得终止状态 当一个进程中止时,内核就向其父进程发送SIGCHLD信号(异步信号) 父进程可以选择忽略或提供信号处理程序 如果父进程进程之前终止进程的父进程都变为init进程。...任意时刻调用,可能会阻塞 4.1.2 区别 wait:使调用者阻塞 waitpid:选项可设置为阻塞或不阻塞,允许指定等待的进程 4.1.3 参数 不为空,则将状态信息保存在参数返回 终止状态宏:存放在...,是否终止看信号类型,以及是否捕获该信号 进程调用kill(1):将信号发送给另一个进程是否终止看信号类型,以及是否捕获该信号 检测到某种软件条件已经发生,发送信号通知其他进程 一些常见的信号 SIGABORT

2.2K42
  • 使用python执行shell脚本 并动态传参 及subprocess的使用详解

    UNIX,与shell=False(默认):在这种情况下,POPEN 类使用os.execvp()来执行子程序。 args通常应该是一个序列。...UNIX,使用shell = True:如果args是一个字符串,则它指定要通过shell执行的命令字符串。...如果设置universal_newlines为true,则文件对象stdout和stderr将作为文本文件打开,但可能会有\ n,Unix行尾约定\ r,Macintosh约定或\ r \ n的任何行终止...(仅限Windows) Popen对象的一些方法 Popen.poll() 检查进程是否终止,返回对象的returncode Popen.wait() 等待进程完成,阻塞。...返回returncode Popen.communicate(input=None) 将信息输入到进程,从stdout和stderr读取数据,直到达到文件结尾。等待进程终止

    5.5K30

    本文帮你Unix玩转C语言

    waitpid【此函数获取信息,释放资源】父进程等待进程终止,可以得到进程何时终止。system函数是exec外包了一层。...定向到文件是全缓冲 信号可由进程自身产生【abort】、其他进程【kill(pidid,sig)】或内核产生。 父进程提前终止的的进程由init【init默认有wait】进程领养。...如果收到SIGCHLD信号调用wait,可以立刻返回,如果任意时刻调wait,可能会阻塞直到有一个进程终止。...kill命令和kill函数只是将一个信号送给一个进程或组,进程是否终止取决于信号的类型,以及进程是否安排了捕捉该信号。...阻塞结束后内核只传递这种信号一次。【屏蔽字为0代表没有信号阻塞,执行哪个信号的处理函数屏蔽哪个信号】 unix低速系统调用阻塞期间【磁盘IO一般不阻塞】如果接受到一个信号,则该低速系统调用被中断。

    84210

    CSAPP 网络编程 笔记

    连接断开(送给控制进程终止 SIGALRM 计时器到时(alarm) 终止 SIGCHLD 进程状态改变 忽略 SIGURG 紧急数据到达 忽略 SIGIO 异步I/...O 终止 SIGINT 终端中断符 终止 SIGPIPE 写至进程的管套 终止 SIGKILL 终止进程 终止 管道与 FIFO 管道可用于具有亲缘关系进程间的通信...命令管道克服了管道没有名字的限制,命名管道允许亲缘关系进程间的通信 UNIX 域协议 IPC 消息通信 消息通信通过消息队列实现进程通信 消息队列是消息的链接表 有足够的权限的进程可以向队列添加消息...,如信号量 问题 命名管道、管道的区别 命名管道以 FIFO 的形式存在于文件系统,与 FIFO 创建进程亲缘关系的进程只要能访问该路径,就能彼此通信 管道最后一个关闭后自动消失,而 FIFO 需要通过...fd 是否 fdset (而不是看是否为1?

    57330

    万字长文带你还原进程和线程

    UNIX 进程的地址空间是父进程的一个拷贝,但是确是两个不同的地址空间;不可写的内存区域是共享的。某些 UNIX 实现是正文区两者之间共享,因为它不能被修改。...这个调用在 UNIX 是 exit , Windows 是 ExitProcess。面向屏幕的软件也支持自愿终止操作。...第四个终止进程的原因是,某个进程执行系统调用告诉操作系统杀死某个进程 UNIX ,这个系统调用是 kill。...进程它自己就会创建更多进程,从而形成一个进程层次结构。 UNIX 进程和它的所有进程以及后裔共同组成一个进程组。...当一个进程逻辑无法继续运行时,它就会被阻塞,比如进程等待可以使用的输入。还有可能是这样的情况:由于操作系统已经决定暂时将 CPU 分配给另一个进程,因此准备就绪的进程也有可能会终止

    61930

    深入理解计算机系统:进程

    逻辑流看起来就像是独占处理器地执行程序,每个进程执行逻辑流的一部分然后就被抢占,实际处理器通过上下文保护好进程间的信息,不同的进程中切换。...1)调用进程(父进程),返回进程PID; 2)新创建的进程进程返回0。 并发执行:父子进程是并发运行的独立进程。 相同但是独立的地址空间。...* 默认options=0,挂起调用进程,直到它等待集合的一个进程终止。如果等待集合的一个进程刚调用的时刻就已经终止了,那么waitpid立即返回。返回已终止进程PID,并去除该进程。...一个待处理信号最多只能被接收一次,内核为每个进程pending位向量维护待处理信号集合,而在blocked位向量维护被阻塞的信号集合。 只有接收了k信号,内核才会清除pending的k位。...shell位每个作业创建一个独立的进程组。进程组ID是取自job进程的一个。 Ctrl + C发送SIGINT信号到前台进程的每一个进程终止前台作业。

    1.2K91

    Linux内核编程--进程控制,线程控制,锁机制

    vfork与fork的区别是,vfork并不将父进程的地址空间完全复制到进程。 vfork创建进程后,进程先运行,进程调用exec或exit后,父进程再开始被调度运行。...父进程调用wait/waitpid后会被挂起,直到进程终止运行并将退出状态返回给父进程。 父进程也可以通过wait/waitpid来检验进程是否已经运行结束。...3.终止进程--exit #include void exit(int status) --status: 进程退出码,主要返回给父进程 返回 4.进程启动另一个进程并退出...system函数系统的实现:system函数执行时,会调用fork、execve、waitpid等函数。...3.线程终止--pthread_exit/pthread_join/pthread_cancel 如果进程的任意线程调用了exit、_Exit或者_exit,那么整个进程就会终止

    1.2K20

    csapp 第八章 异常控制流 读书笔记

    getpid函数返回调用进程的PID,getppid函数返回它的父进程的PID(创建调用进程进程) 8.4.2 创建和终止进程 程序员眼中进程的三种状态 运行:进程要么CPU执行,要么等待被执行且最终会被内核调度...进程会因为三种原因终止:1)收到一个信号,该信号的默认行为是终止进程;2)从主程序返回;3)调用exit函数 这些都是 Unix 或者类 Unix 系统(如 Linux)的信号(Signals)。...进程,fork函数返回进程的PID,进程,fork返回0.因为紫禁城的PID总是非零,返回值就提供一个明确的方法来判断程序是进程还是进程执行。...默认的行为是挂起调用进程,直到有进程终止等待进程终止的同时,如果还想做些有用的工作,这个选项会有用。 WUNTRACED:挂起调用进程的执行,直到等待集合的一个进程变成已终止或者被停止。...当父进程创建一个新的进程后,它就把这个子进程添加到作业列表。当父进程SIGCHLD处理程序回收一个终止进程时,它就从作业列表删除这个子进程

    33860

    进程通信

    读写都在缓存内核, 传数据 是 格式的流 且 大小受限 3)跨进程通信实现: fork 创建进程, 复制父进程文件描述符 ,两个进程各有两个「 fd0 与 fd1」,通过各自fd 读写同一管道文件...A | B命令时,都是 shell 创建的进程, 不存父子关系,父进程都是 shell ps:shell 里能使用一个管道搞定的事情,就不要多用一个管道,减少创建进程开销 二、消息队列 解决频繁地交换数据问题..., 内核的消息链表 1、发时 ,分成一个个消息体(数据块),用户自 定义数据类型,固定大小 ,不像 管道 是 格式字节流数据 。...; > = 0可用,继续执行 2)V 操作 ,加 1, 0,没有阻塞P 进入共享资源之 前 , V 离开 后 , 成对出现 2、例:两进程互斥访问共享内存,初始化信号量...:都写入 缓存在内核 ,另一个进程也从内核读, 先进先出 ,不支持 lseek 文件定位 匿名: 「|」竖线就是匿名管道,通信数据 格式的流并且大小受限 , 单向 ,双向要建两个管道, 只能用于父子关系通信

    1.1K45

    Linux:进程地址空间、进程控制(一.进程创建、进程终止进程等待)

    当我们说进程地址空间用于存储“不同类型的数据”时,实际是指它组织和标识了这些数据和代码物理内存的位置。...但实际fork()之后到进程开始写数据之前,父进程进程所共享的是同一个物理内存页面。...更新进程列表:操作系统会从进程列表移除已终止进程。 5.进程等待 5.1必要性 Unix/Linux系统,当进程退出时,它的进程描述符仍然保留在系统,直到父进程通过某种方式获取其退出状态。...传递 0 作为 options 参数时,你实际告诉 waitpid使用最传统的阻塞方式等待进程终止,并且只关心那些已经终止进程 如果子进程已经退出,调用wait/waitpid时,wait...非阻塞等待: 与阻塞等待不同,非阻塞等待允许进程等待进程结束期间继续执行其他任务。 非阻塞等待通常通过轮询或异步通知机制实现,进程会定期检查条件是否满足,或者条件满足时接收通知。

    12500

    Python 标准类库-并发执行之multiprocessing-基于进程的并行

    因此,multiprocessing模块允许程序员充分利用给定机器的多个处理器。它同时Unix和Windows运行。 该模块还引入了在线程模块没有类似程序的API。...以下示例演示了模块定义此类函数,以便进程能够成功导入该模块的常见做法。...For example 3.4版本中进行了更改:在所有unix平台上添加了spawn,并为一些unix平台添加了forkserver。进程不再继承Windows的所有父级可继承句柄。...如果timeout是一个正数,则表示最多阻塞timeout参数指定的秒数。请注意,如果该方法的进程终止或方法超时,则该方法将返回None。检查进程的退出码以确定它是否终止。...is_alive() 返回进程是否还存活 大致进程对象从start()方法返回的那一刻起一直处于活动状态,直到进程终止。 daemon 进程的守护进程标志,一个布尔值。

    73420

    python并发编程之多进程(理论)

    ,而非阻塞则不会阻塞当前的进程 六、进程的创建与终止(了解) 进程的创建:   但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要有创建进程的方式,一些操作系统只为一个应用程序设计...UNIX该系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(shell解释器进程,执行一个命令就会创建一个进程)   2....2.不同的是:UNIX进程的初始地址空间是父进程的一个副本,提示:进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程进程的地址空间就是不同的。...windows,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制进程,但是父进程有权把该句柄传给其他进程...八、进程的状态  其实在两种情况下会导致一个进程逻辑不能运行,   1. 进程挂起是自身原因,遇到I/O阻塞,便要让出CPU让其他进程去执行,这样保证CPU一直工作   2.

    1K70

    Linux系统-进程信号

    ),还有一个函数指针表示处理动作 注:block位图中,比特位的位置代表某一个信号,比特位的内容代表该信号是否阻塞pending位图中,比特位的位置代表某一个信号,比特位的内容代表是否收到该信号...有效”和“无效”的含义是该信号是否阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态 阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略...,按Ctrl-\仍然可以终止程序,因为SIGQUIT信号没有阻塞 四、捕捉信号 1、内核的信号捕捉 如果信号的处理动作是用户自定义函数,信号递达时就调用这个函数,这称为捕捉信号 信号捕获处理过程...,也可以非阻塞地查询是否进程结束等待清理(轮询的方式):采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程处理自己的工作的同时还要记得时不时地轮询一 下,程序实现复杂...其实进程终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,进程终止时会通知父进程

    3.5K10

    操作系统复习笔记——第三章 进程

    UNIX操作系统,每个进程用唯一整数标识符来标识,通过fork()系统调用,可创建新进程,新进程通过复制原来进程的地址空间而成。这种机制允许父子进程之间方便的通信。...(为判定是否发生这种情况,要求父进程有一个检查其进程状态的机制) 分配给进程的任务已经不需要 父进程退出,如果父进程终止,那么操作系统不允许进程继续(有些操作系统,对于这类操作系统这种现象称为级联终止...UNIX:可以通过系统调用exit()来终止进程,父进程可以通过系统调用wait()以等待进程终止。系统调用wait()返回了中止进程进程标识符,以使父进程能够知道哪个子进程终止了。...共享内存模式,建立起一块供协作进程共享的内存区域,进程通过向此共享区域读或写入数据来交换信息。消息传递模式,通过协作进程间交换消息来实现通信。...非阻塞 receive:接收者收到一个有效消息或空消息。 阻塞: 有条件等待 两个过程,快的等待慢的,(因为计算机不能变快,只能变慢)

    96010

    进程之舞:操作系统的启动、状态转换与唤醒艺术

    PCB地址 相同状态的进程同一索引表; 不同状态的,分别设置各自的PCB索引表 就绪索引表 阻塞索引表 ​ 索引方式优点 索引方式是线性表方式的改进,克服了线性表的缺点,检索速度快 索引方式缺点...一个进程只有一个父进程 A——B: A是B的父进程 B是A的进程进程创建 1.引起创建进程的事件: (1)系统初始化:当开机引导OS时,会创建许多进程 (2)派生新进程:应用进程利用系统调用创建一个或多个进程...使用创建原语创建进程的过程 申请一个空闲的PCB 为新进程分配空间 初始化PCB 将新进程插入就绪队列 UNIX/Linux的fork()系统调用实现进程创建功能。 ​ ​...将被终止进程的PCB从原来队列摘走,以后由父进程从中获取数据,并释放它 进程阻塞 1.引起进程阻塞的事件 处于运行状态的进程,在其运行过程中期待某一事件发生,当被等待的事件还没有发生时...唤醒过程 唤醒原语执行过程如下: 把阻塞进程从相应的阻塞队列摘下。 将现行状态改为就绪状态,然后把该进程插入就绪队列

    16210

    通过 multiprocessing 实现 python 多进程

    sentinel — 系统对象的数字句柄, UNIX 是一个文件描述符 4.1.2....类成员方法 run — 进程的具体活动 start — 启动进程活动 join — 等待进程执行结束或超时 is_alive — 判断进程是否存活 terminate — 终止进程 UNIX 环境...,通过给进程发送 SIGTERM 信号实现, Windows 环境,通过 TerminateProcess 方法实现,被终止进程进程将不会被一起终止 需要注意的是,正如我们上面所说,start(...进程只会继承那些运行进程对象的 run() 方法所需的资源,父进程中非必须的文件描述符和句柄则不会被继承,与另两种方法相比,这个方法启动进程非常慢,是 windows 的默认设置,也可用在 Unix... fork — 通过 os.fork() 方法创建进程进程开始时与父进程完全相同,会继承父进程的所有资源,只能用于 Unix,是 Unix 系统的默认方式 forkserver — 启动服务器进程

    73240

    【Linux】信号>信号产生&&信号处理&&信号保存&&信号详解

    :clean clean: rm -f sig 4.5 SIGCHLD信号 过用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待进程结束,也可以非阻塞地查询是否进程结束等待清理(也就是轮询的方式...采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程处理自己的工作的同时还要记得时不时地轮询一 下,程序实现复杂 其实,进程终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略...,父进程可以自 定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,进程 终止时会通知父进程,父进程信号处理函数调用wait清理进程即可 请编写一个程序完成以下功能...:父进程fork出进程进程调用exit(2)终止,父进程自定义SIGCHLD信号的处理函数,在其中调用wait获得进程的退出状态并打印 事实,由于UNIX 的历史原因,要想不产生僵尸进程还有另外一种办法...:父进程调用sigaction将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的进程终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程

    15810
    领券