900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Linux 父进程 子进程 回收 回收 fork() 的子进程

Linux 父进程 子进程 回收 回收 fork() 的子进程

时间:2023-05-27 23:20:32

相关推荐

Linux 父进程 子进程 回收 回收 fork() 的子进程

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

使用 fork() 函数派生出多个子进程来并行执行程序的不同代码块,是一种常用的编程泛型。但是,在使用 fork() 函数时若处理不当,很容易产生僵尸进程。

fork()#include

#include

int main(int argc, char **argv) {

while (1) {

pid_t pid = fork();

if (pid > 0) {

// 主进程

sleep(5);

} else if (pid == 0) {

// 子进程

return 0;

} else {

fprintf(stderr, "fork errorn");

return 2;

}

}

}

该函数的返回值有三种情况,分别是:大于 0,表示当前进程为父进程,返回值是子进程号;

等于 0,表示当前进程是子进程;

小于 0(确切地说是等于 -1),表示 fork() 调用失败。

示例代码每 5 秒创建一个子进程,而且没有等待回收,变成僵尸进程$ gcc test.c -o fork

$ ./fork

kk 24336 17551 0 11:16 pts/6 00:00:00 ./fork

kk 24337 24336 0 11:16 pts/6 00:00:00 [fork]

kk 24340 24336 0 11:16 pts/6 00:00:00 [fork]

kk 24345 24336 0 11:16 pts/6 00:00:00 [fork]

僵尸进程

僵尸进程是指子进程退出后,它的父进程没有“等待”该子进程,这样的子进程就会成为僵尸进程。

一般父进程需要调用 wait 或 waitpid 来等待子进程进行回收

wait

waitpid

SIGCHLD

在 SIGCHLD 中调用 wait 或 waitpid

SIG_IGN

除了在 SIGCHLD 信号处理函数中调用 wait() 来避免产生僵尸进程,我们还可以选择忽略 SIGCHLD 信号,告知操作系统父进程不关心子进程的退出状态,可以直接清理。signal(SIGCHLD, SIG_IGN);

但需要注意的是,在部分 BSD 系统中,这种做法仍会产生僵尸进程。因此更为通用的方法还是使用 wait() 函数。

需要区分僵尸进程和孤儿进程

Ref

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。