- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做多进程的实践。我只是想查看父进程id,它看起来和我想象的不一样。这是我的代码:
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <string.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void child1()
{
//printf("we are child1..\n");
printf("my pid is:%d\n",getpid());
printf("I am child1..\n");
}
void child2()
{
//printf("we are child2..\n");
printf("my pid is:%d\n",getpid());
printf("I am child2.., my parent is:%d\n",getppid());
}
int main()
{
pid_t childpid[4];
int i;
printf("main pid is:%d\n",getpid());
for (i=0;i<2;i++)
{
childpid[i] = fork();
if (childpid[i]<0)
printf("fork fail..\n");
else if (childpid[i]==0)
{
childpid[i+2] = fork();
if (childpid[i+2] <0)
printf("fork inside fail..\n");
else if (childpid[i+2]==0)
child2();
else // this is parent process..
child1();
}
}
}
这是执行结果:
my pid is:3951
I am child1..
my pid is:3950
I am child1..
my pid is:3952
I am child2.., my parent is:1118
my pid is:3954
I am child1..
my pid is:3953
I am child2.., my parent is:1118
my pid is:3956
I am child1..
my pid is:3955
I am child2.., my parent is:1118
my pid is:3957
I am child2.., my parent is:1118
由于我的 child2 进程是在 process1 内部 fork 的,因此我预计父进程 pid 可能类似于:3950。为什么我的结果是:1118?
感谢您的帮助!
最佳答案
当我逐字运行您的代码时(好吧,我向每个空参数列表添加了 void
并将子函数设置为 static
),然后我得到了示例输出:
main pid is:46761
my pid is:46762
I am child1..
my pid is:46763
my pid is:46764
I am child1..
I am child2.., my parent is:46762
my pid is:46765
I am child2.., my parent is:1
my pid is:46766
I am child1..
my pid is:46768
my pid is:46767
I am child2.., my parent is:46766
I am child1..
my pid is:46769
I am child2.., my parent is:1
为了娱乐值(value),我将输出运行到管道并得到:
main pid is:46770
main pid is:46770
my pid is:46773
I am child1..
main pid is:46770
my pid is:46772
I am child1..
main pid is:46770
my pid is:46775
I am child2.., my parent is:1
main pid is:46770
my pid is:46774
I am child2.., my parent is:46772
main pid is:46770
my pid is:46772
I am child1..
my pid is:46776
I am child1..
main pid is:46770
my pid is:46772
I am child1..
my pid is:46778
I am child2.., my parent is:1
main pid is:46770
my pid is:46774
I am child2.., my parent is:46772
my pid is:46777
I am child1..
main pid is:46770
my pid is:46774
I am child2.., my parent is:46772
my pid is:46779
I am child2.., my parent is:46777
参见printf()
anomaly after fork()
以获得对该行为的解释。
然后我对您的代码进行了稍微不同的检测,但核心逻辑没有改变:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
static void child1(void)
{
printf("Child1: PID = %d, PPID = %d\n", (int)getpid(), (int)getppid());
}
static void child2(void)
{
printf("Child2: PID = %d, PPID = %d\n", (int)getpid(), (int)getppid());
}
int main(void)
{
pid_t childpid[4];
int i;
printf("main pid is:%d\n", getpid());
for (i = 0; i < 2; i++)
{
fflush(0);
childpid[i] = fork();
if (childpid[i] < 0)
printf("fork fail in PID %d\n", getpid());
else if (childpid[i] == 0)
{
childpid[i + 2] = fork();
if (childpid[i + 2] < 0)
printf("fork fail in PID %d\n", getpid());
else if (childpid[i + 2] == 0)
child2();
else
{
printf("child pid %d forked child %d\n", (int)getpid(), (int)childpid[i+2]);
child1();
}
}
else
printf("main pid %d forked child %d\n", (int)getpid(), (int)childpid[i]);
}
int status;
int corpse;
while ((corpse = wait(&status)) != -1)
printf("PID %d: child %d died with status %.4X\n", (int)getpid(), corpse, status);
printf("PID %d: finished\n", (int)getpid());
return getpid() % 256;
}
我确实添加了代码来等待子进程死亡,并报告进程何时完成,并为大多数进程添加了非零退出状态。该代码还在 fork 之前刷新标准输出以保持干净(即使输出将发送到管道或文件)。
在我的 Mac OS X 10.11.1 El Capitan 机器上,我得到了,例如:
main pid is:46730
main pid 46730 forked child 46731
main pid 46730 forked child 46732
child pid 46731 forked child 46733
Child1: PID = 46731, PPID = 46730
child pid 46732 forked child 46734
main pid 46731 forked child 46735
Child1: PID = 46732, PPID = 46730
Child2: PID = 46733, PPID = 46731
Child2: PID = 46734, PPID = 46732
PID 46734: finished
main pid 46733 forked child 46736
PID 46732: child 46734 died with status 8E00
PID 46732: finished
child pid 46735 forked child 46737
Child1: PID = 46735, PPID = 46731
PID 46730: child 46732 died with status 8C00
Child2: PID = 46737, PPID = 46735
child pid 46736 forked child 46738
Child1: PID = 46736, PPID = 46733
PID 46737: finished
Child2: PID = 46738, PPID = 46736
PID 46735: child 46737 died with status 9100
PID 46735: finished
PID 46738: finished
PID 46736: child 46738 died with status 9200
PID 46731: child 46735 died with status 8F00
PID 46736: finished
PID 46733: child 46736 died with status 9000
PID 46733: finished
PID 46731: child 46733 died with status 8D00
PID 46731: finished
PID 46730: child 46731 died with status 8B00
PID 46730: finished
当您研究该输出中的排序时,会发现一些有趣的执行交错。
这些都不能解释为什么你得到 1118;在很多方面,这是无法解释的,因为没有人可以按照你的机器上的方式对事物进行完全排序。然而,我所展示的是看似合理的行为,并且它不会重现“所有进程都有一个 PID 作为 PPID”。您应该能够对代码进行增量监控改进,并演示哪些更改会改变您计算机上的行为。
关于无法使用 getppid() 获取预期的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34036229/
我能够在 Windows 中运行 Odoo v8 代码。但是当我调试代码时,出现错误: ppid = os.getppid() AttributeError: 'module' object has
getppid() 返回父进程的进程 ID。 因为任何给定进程在任何时候都只能有一个父进程。从 getppid 返回是有道理的。 是否有对 getChildPid 的等效系统调用? 我知道一个进程可以
我正在做多进程的实践。我只是想查看父进程id,它看起来和我想象的不一样。这是我的代码: #include #include #include #include #include #inclu
当调用 fork() 时,父进程的 PID 保存在子进程的 PCB 中。在什么情况下, child 知道其 parent 的 PID 会有用? 最佳答案 例如,进程可能希望知道它是否在系统启动时由 i
我四处搜索,但无法找到我要找的东西。我知道 getpid() 返回调用进程的进程 ID,getppid() 返回调用进程父进程的进程 ID。但是有没有函数可以获取程序的进程ID呢?或者这就是上述两者之
这是我的代码,为了执行这个程序,我运行 ./2c 10 5 —参数 1 为 10,参数 2 为 5。该程序将运行 10 个子进程,第 5 个子进程将生成另一个子进程,但在这种情况下,我的 ppid 始
当我运行下面的代码时 #include #include //int i=0; int main(){ int id ; id = fork() ; printf("id value : %d\n
/* In alarm.c, the first function, ding, simulates an alarm clock. */ #include #include #include
这个问题在这里已经有了答案: Why do processes I fork get systemd as their parent? (3 个答案) 关闭 6 年前。 我一直在努力学习 fork
我的目标是找出运行我的 JavaScript 代码的线程和进程的线程 ID 和进程 ID。我找不到可以提供此功能的函数,因此我使用下面编写的基本 C 代码,并使用 emscripten 将其转译为 J
我正在运行程序 #include #include main() { pid_t pid, ppid; printf("Hello World1\n"); pid=fork(
我是一名优秀的程序员,十分优秀!