系统相关
首页 > 系统相关> > linux – 如果父进程仍在运行,子进程的PID是否可以重用?

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

作者:互联网

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

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

下面的bash脚本示例:

local file=$1
local count=0
<files are split; and suffixed with aa,ab,ac,ad>

/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