C保存分叉的pid

时间:2014-11-08 20:24:15

标签: c signals fork

您好我有这样的问题

pid_t pid1;
pid_t pid2;

void switch_files(int sig_type)
{
    printf("%d %d\n", pid1, pid2);
}
int main(int argc, char **argv)
{
    pid_t lpid1,lpid2;        
    if ((lpid1 = fork()) == 0)
    {
        signal(SIGUSR1, switch_files);
      //Some work   
    } else {
        pid1 = lpid1;
    }
    if ((lpid2 = fork()) == 0)
    {
        signal(SIGUSR2, switch_files);
        //Some work

    } else {
        pid2 = lpid2;
    }


    while(scanf("%s", input) > 0)
    {
        write(pipe1[1], input, strlen(input) + 1);
        kill(pid1, SIGUSR1);
    }

    waitpid(pid1, 0, 0);
    waitpid(pid2, 0, 0);
}

所以我需要在我的回调信号中有pid1pid2的值,而在printf我有0 0,但在main中我有正常的pids值。我如何解决这个问题,谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

如果您希望孩子拥有pid,只需要求:

if ((lpid1 = fork()) == 0)
    {
        pid1 = getpid();
        pid2 = -1; // other child doesn't even exist yet
        signal(SIGUSR1, switch_files);
        //Some work
        exit(0); // you don't want the child to go executing parent code, do you?
    }

if ((lpid2 = fork()) == 0)
    {
        //pid1 already set with pid of 1st child
        pid2 = getpid();
        signal(SIGUSR2, switch_files);
        //Some work
        exit(0); // you don't want the child to go executing parent code, do you?
    }

如果你需要第一个孩子拥有第二个孩子的pid,那么你需要使用some form of IPC,这样你就可以在第二个孩子开始并且它的pid是已知的。

答案 1 :(得分:0)

如果您希望孩子们获得信息,您必须以某种方式向他们传达这些信息。您可以使用文件,管道,共享内存或任何所需的机制。但你必须以某种方式传递信息。