【发布时间】:2017-06-29 20:00:19
【问题描述】:
Linux/POSIX 中是否有方法或 C api 来确定当前进程是否为 fork? IE。如果它是通过调用fork() 而没有随后调用execve() 系列创建的?
我不控制导致这一点的代码(它在高级语言绑定中运行)。我只需要知道当前进程是在运行顶级程序还是在其分支中。
我想出的最好的方法是测试进程是否具有与其父进程相同的 gid:
int is_fork = getpgid(0) == getpgid(getppid());
但是,这仅在父级调用 setpgid() 时才有效,而 execve() 默认情况下显然不会这样做。所以这会导致很多误报。
【问题讨论】:
-
你控制程序吗?如果是的话,我能想到的找出类似情况的唯一方法是在
fork()之后的分叉子进程中设置一个状态变量。 -
你的措辞有点奇怪。 每个进程(除了init)都是由
fork()创建的所以你的问题应该是:我的进程是进程组长吗? -
@wildplasser 我确实不熟悉术语。但是我认为进程组组长是调用
setpgid()的祖先proc,而不是调用exec()的那个? -
exec() 在这里不相关。该过程被不同的图像替换,但基本保持不变。只有几件事发生了变化(主要是内存映射和信号设置)
-
顺便说一句:你的 `int is_fork = getpgid(0) == getpgid(getppid())` 中缺少分号...