执行和打印子PID

时间:2013-10-09 20:53:28

标签: c linux if-statement

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

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

由于

2 个答案:

答案 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");
}