0

我正在尝试获取子进程的 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); 
            }

请假设我的其他代码是正确的。

谢谢

4

2 回答 2

2

我对可能发生的事情有一个偷偷摸摸的怀疑。这扩展了卡尔的回答。

假设你的代码做这样的事情......(如果没有更多细节,我不能 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 最常见并不罕见)。

于 2013-10-09T21:10:50.007 回答
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");
}
于 2013-10-09T20:57:04.643 回答