linux pid 父进程,linux – 如果父进程仍在运行,子进程的PID是否可以重用?

我在基于* nix的操作系统上运行,并且有一个同时启动多个进程的脚本.我的主要目标是同时启动这些进程,并收集每个进程的返回退出状态.我发现使用wait(pid)将实现这一点,因为所有子进程都由父进程拥有.但是,我担心一旦子进程(其中一个并发进程启动)完成,其PID将被释放并可在系统中回收.

所以我想问题是,如果父进程同时启动多个子进程,那么完成的子进程的PID是否可以在父进程完成之前提供给系统进行回收?如果是这样,我怎样才能最好地获得每个子进程的退出状态?

下面的bash脚本示例:

local file=$1

local count=0

/home/text/concurrencyTest.sh $file-aa >> /home/text/$file-aa.log 2>&1 &

/home/text/concurrencyTest1.sh $file-ab >> /home/text/$file-ab.log 2>&1 &

/home/text/concurrencyTest2.sh $file-ac >> /home/text/$file-ac.log 2>&1 &

/home/text/concurrencyTest3.sh $file-ad >> /home/text/$file-ad.log 2>&1 &

for job in `jobs -p`

do

echo "Job: $job"

wait "$job"

rc=$?

echo "RC for $job is $rc"

if [[ rc -ne 0 ]]; then

FAIL[$count]="$job"

((count++))

fi

done

if [[ $count -ne 0 ]]; then

echo "ERROR: $count Job(s) Failed!"

echo "Failed Process PID(s): ${FAIL[@]}"

echo "Failed Processing for file: $file"

return 1

fi

解决方法:

当父进程调用wait或waitpid(或该系列的任何其他函数,如wait3,wait4等)时,子进程的PID可以重用.

当孩子死亡时,它会作为一个僵尸留在后面 – 一个进程表中的一个条目,后面没有任何进程,它只是保留进程ID并存储退出状态.调用waitpid块直到指定的子进程终止(或者如果它已经死了则立即返回),检索子进程的状态代码,并获取僵尸(即删除进程表条目,释放进程ID以便重用).调用等待类似,但只要一个子进程死亡就会返回.

如果父进程在进程终止时忽略SIGCHLD信号,则该进程不会变为僵尸,并且其PID可立即重用.父母对SIGCHLD的地位在其他方面很重要;见例如POSIX为坚韧不拔的细节.

如果父进程在子进程之前死亡,那么该子进程被认为是init采用的孤儿,进程是PID 1.这是init收获孤儿的工作的一部分.

在shell脚本中,wait builtin with是等待系统调用的包装器.如果脚本有多个子节点,则等待所有节点都没有参数块,然后等待一些参数块直到所有指定的进程都死掉(没有办法等到一个进程死亡而没有指定哪个).如果等待$pid1返回,那么$pid2可能已经死亡并且已经被重用于另一个进程;但是,即使如此,shell也会跟踪$pid2的状态代码,随后的等待$pid2将返回其状态代码.但是,在此之前,您不应该分叉新的后台作业,以避免在将$pid2重用于后台作业时出现混淆.

标签:linux,concurrency,exit-code,pid,return-code

来源: https://codeday.me/bug/20190623/1271149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值