C保存分叉pid

C保存分叉pid,c,signals,fork,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);

你好,我有这样的问题

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);
}

因此,我需要在信号回调中有
pid1
pid2
的值,在printf中,我有
0
,但基本上我有正常的pids值。我该如何解决这个问题,谢谢你的帮助。

如果你想让孩子们知道信息,你必须以某种方式与他们交流这些信息。您可以使用文件、管道、共享内存或任何想要的机制。但是你必须以某种方式传递信息。

如果你想让孩子拥有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?
    }


如果您需要第一个子进程具有第二个子进程的pid,那么您需要使用,这样您可以在第二个子进程启动且其pid已知后与第一个子进程通信。

是否
//一些工作
部分包括子进程退出,或者,您的代码是不是只运行在父级中的代码?第二个子级将知道第一个子级的pid;除非您采取主要步骤将信息传递给第一个孩子,否则第一个孩子永远不会知道第二个孩子的pid。
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?
    }