子进程清理

简介:

一般我们在程序设计的时候,我们使用wait来获取子进程的退出状态,但是wait将会阻塞等到子进程结束。对于waitpid来说:
    pid_t waitpid(pid_t pid, int *statloc, int options);
我们可以通过设置第3个参数options为WNOHANG来使waitpid为非阻塞,但这样的话,我们就需要不断的调用waitpid来探测子进程是否结束。

    signal中有一个SIGCHLD,当一个进程终止或停止时,将SIGCHLD信号发送给其父进程。按照系统默认情况,这个信号是被忽略的。如果父进程希望被告知其子进程的这种状态的变化,则应该设置捕获这个信号。在信号处理函数里面,通常要调用一种wait来获取子进程的ID和其退出状态。

复制代码
 
 
#include < sys / types.h >
#include
< unistd.h >
#include
< stdio.h >
#include
< string .h >
#include
< sys / wait.h >
#include
< signal.h >

sig_atomic_t child_exit_state;

void clean_child_process( int sig_number){
int status;
wait(
& status);
child_exit_state
= status;
}

int main( int argc, char ** argv){
pid_t pid;

struct sigaction action;
memset(
& action, 0 , sizeof (action));
action.sa_handler
=& clean_child_process;
sigaction( SIGCHLD,
& action,NULL);

pid
= fork();
}

int main( int argc, char ** argv){
pid_t pid;

struct sigaction action;
memset(
& action, 0 , sizeof (action));
action.sa_handler
=& clean_child_process;
sigaction( SIGCHLD,
& action,NULL);

pid
= fork();
if (pid == 0 ) {
printf(
" Child process...\n " );
sleep(
5 );
printf(
" Child terminated.\n " );
}
else {
printf(
" Parent process...\n " );
sleep(
6 );
printf(
" Child status: %d\n " , child_exit_state);
}

return 0 ;
}
复制代码


相关文章
|
5月前
|
C语言
C语言 父进程fork()出的多个子进程在结束后,父进程如何回收?
我在网上找了半天都是在说wait()和waitpid()的详解或者是单个子进程的回收。答非所问。 很简单,根据wait()或者waitpid()的函数特性。没有子进程时返回-1。
51 0
|
7月前
|
调度 Windows
7.6 实现进程挂起与恢复
挂起与恢复进程是指暂停或恢复进程的工作状态,以达到一定的控制和管理效果。在 Windows 操作系统中,可以使用系统提供的函数实现进程的挂起和恢复,以达到对进程的控制和调度。需要注意,过度使用进程挂起/恢复操作可能会造成系统性能的降低,导致死锁等问题,因此在使用时应该谨慎而慎重。同时,通过和其他进程之间协同工作,也可以通过更加灵活的方式,实现进程的协调、交互等相应的功能,从而实现更加高效和可靠的进程管理。
69 0
|
3月前
进程之 回收子进程之避免僵尸进程的产生
wait() 与 waitpid() 函数的使用.
28 0
|
5月前
|
Shell
回收子进程
回收子进程
30 0
|
11月前
|
缓存 Linux 调度
fork函数、进程退出、进程等待(1)
在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
134 0
|
11月前
|
存储 编译器 调度
fork函数、进程退出、进程等待(2)
 return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返 回值当做 exit的参数。
119 0
|
12月前
|
C#
C#开发:执行进程等待
C#开发:执行进程等待
163 0
|
Shell Linux C语言
【Linux进程】六、wait()函数——子进程回收
【Linux进程】六、wait()函数——子进程回收
385 0
【Linux进程】六、wait()函数——子进程回收
|
物联网 Linux 开发者
注册进程退出清理函数|学习笔记
快速学习注册进程退出清理函数
144 0
注册进程退出清理函数|学习笔记
|
物联网 Linux C语言
子进程继承父进程缓冲区|学习笔记
快速学习子进程继承父进程缓冲区
106 0