我正在尝试获取子进程的PID。 但是当我运行execl时,它会打印出0的PID,有时会输出负数而不是真正的PID。 但是,如果我删除execl行,它工作正常。 谁知道为什么?
if (pid==0)
{
arrayPID[i] = getpid();
execl("/bin/ls","/bin/ls",NULL);
}
printf ("Child PID is %i\n",arrayPID[i]);
请注意,我知道execl的第二个参数应该只是“ls”,但它似乎正在工作,我需要这样做。是因为这个吗?
我也尝试过这个但仍为PID提供零值或负值。
if (pid==0)
{
arrayPID[i] = getpid();
}
if (pid==0)
{
execl("/bin/ls","/bin/ls",NULL);
}
请假设我的其他代码是正确的。
由于
答案 0 :(得分:3)
我对可能发生的事情有一种潜在的怀疑。这延伸了卡尔的答案。
假设你的代码做了类似的事情......(没有更多细节,我无法100%确定)
int pid = fork();
if (pid == 0) {
arrayPID[i] = getpid();
execl("/bin/ls","/bin/ls",NULL);
}
printf ("Child PID is %i\n",arrayPID[i]);
问题是您只在子进程中输入if
语句,而不是父进程。子进程将调用execl
,除非出现问题,否则永远不会到达printf
(尽管它会打印出来,但它会打印出您想要的内容)。
因此,在父进程中,如果您未在此段代码之前初始化arrayPID[i]
,则在到达printf
时它仍然未初始化,并且因此基本上打印出垃圾(虽然我认为最常见的0并不罕见)。
答案 1 :(得分:2)
fork()
将子进程的PID返回给父进程。在孩子中调用getpid
不会做任何事情。
我猜您正在寻找的是:
pid_t pid = fork();
if (pid == 0)
{
// child
execl("/bin/ls", "ls", NULL);
}
else if (pid > 0)
{
// parent
printf("Child PID is %d\n", (int)pid);
}
else
{
// error
perror("fork failed");
}