所以我一直在阅读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;
答案 0 :(得分:4)
在pid
为zero
的孩子中,fork
会将子pid返回给父级,但是子级获得zero
,并且您尝试使用pid 0杀死进程,但是pid的初始值为1
,您可以使用getpid()
来获取pid
的当前child
。然后尝试发出信号。
编辑:
而且,当循环进入第一次时,pid
未被初始化,这也可能导致未定义的行为。谢谢@Giresh