简单C子/父程序中意外终止

时间:2014-01-30 06:13:56

标签: c signals fork kill

所以我一直在阅读StackOverflow和fork man-page上的帖子,我只是没有得到我看到的行为,可能是因为我只是在寻找我期望的内容。

它是一个简单的程序,它接受一个文件名,生成一个子文件,在文件上运行stat(),然后在循环中将SIGUSR1或2返回给父文件。父母只想知道它的1或2 ...... 我得到的是“用户定义信号2”,然后程序退出。但是父母正在进行一段时间的循环吗?

无论如何,我真的希望有人可以解释为什么我没有得到预期的输出,特别是循环不断要求文件名并每次产生一个孩子而父母知道孩子返回的信号是什么杀()。

pid_t pid;

while(1) {
    if(pid == 0) // i am the child
    {
        FILE *fp = fopen(fname, "r");
        if(fp == NULL){
            printf("%d] Child cannot find [%s].", msg++, fname);
            fclose(fp);
        }
        else {
            stat(fname, &st);
            n = st.st_size;
            printf("%d] Child read %d chars.\n", msg++, n);
            if(n%2) kill(pid, SIGUSR1);
                else kill(pid, SIGUSR2);
        }

    }
    else // im the parent
    {
        if( signal(SIGUSR1,NULL) ) // Code never gets here because it ends
            printf("%s is odd\n", fname );

        if( signal(SIGUSR2, NULL) )
            printf("$s is even\n", fname );

        printf("%d] Enter filenames until you're happy. 'die' to end.\n", msg++);
        scanf("%s", fname);
        pid = fork();
    }

}
return 0;

1 个答案:

答案 0 :(得分:4)

pidzero的孩子中,fork会将子pid返回给父级,但是子级获得zero,并且您尝试使用pid 0杀死进程,但是pid的初始值为1,您可以使用getpid()来获取pid的当前child。然后尝试发出信号。

编辑: 而且,当循环进入第一次时,pid未被初始化,这也可能导致未定义的行为。谢谢@Giresh