【发布时间】:2021-03-08 07:56:59
【问题描述】:
当我使用 fork() 创建和终止进程时,突然我的输出行为异常。我希望我的程序读取所有行并终止。但是,当它使用 fork 时,while 循环永远不会终止。 这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#define MAXLINE 1024
int main(void) {
char buf[MAXLINE];
printf("prompt: \n");
while (fgets(buf, MAXLINE, stdin) != NULL){
if (fprintf(stdout, "PParent: %s\n", buf) == EOF)
printf("output err");
pid_t child = fork();
switch(child){
case -1:
perror("fork");
exit(EXIT_FAILURE);
break;
case 0:
printf("Child %d: dying\n", getpid());
exit(0);
break;
default:
waitpid (child, NULL, 0);
}
}
exit(0);
}
我希望我的输出是
prompt:
Parent: THIS IS LINE 1
Child 31201: dying
Parent: THIS IS LINE 2
Child 31202: dying
Parent: THIS IS LINE 3
Child 31203: dying
Parent: THIS IS LINE 4
Child 31204: dying
Parent: THIS IS LINE 5
Child 31205: dying
Parent: THIS IS LINE 6
Child 31206: dying
Parent: THIS IS LINE 7
Child 31207: dying
Parent: THIS IS LINE 8
Child 31208: dying
Parent: THIS IS LINE 9
Child 31209: dying
Parent: THIS IS LINE 10
Child 31210: dying
Parent: THIS IS LINE 11
Child 31211: dying
但我明白了:
prompt:
Parent: THIS IS LINE 1
Child 14090: dying
Parent: THIS IS LINE 2
Child 14091: dying
Parent: THIS IS LINE 3
Child 14092: dying
Parent: THIS IS LINE 4
Child 14093: dying
Parent: THIS IS LINE 5
Child 14094: dying
Parent: THIS IS LINE 6
Child 14095: dying
Parent: THIS IS LINE 7
Child 14096: dying
Parent: THIS IS LINE 8
Child 14097: dying
Parent: THIS IS LINE 9
Child 14098: dying
Parent: THIS IS LINE 10
Child 14099: dying
Parent: THIS IS LINE 11
Child 14100: dying
Parent: THIS IS LINE 2
Child 14101: dying
Parent: THIS IS LINE 3
Child 14102: dying
Parent: THIS IS LINE 4
Child 14103: dying
Parent: THIS IS LINE 5
Child 14104: dying
Parent: THIS IS LINE 6
Child 14105: dying
Parent: THIS IS LINE 7
Child 14106: dying
Parent: THIS IS LINE 8
Child 14107: dying
Parent: THIS IS LINE 9
Child 14108: dying
Parent: THIS IS LINE 10
Child 14109: dying
Parent: THIS IS LINE 11
Child 14110: dying
Parent:
Child 14111: dying
Parent: THIS IS LINE 2
Child 14112: dying
Parent: THIS IS LINE 3
...
它会永远存在。如果我不使用 fork,我将获得所需的输出。但我的问题是为什么使用 fork 导致输出是这样的?子进程在创建后立即被杀死,甚至没有使用 STDIN。
【问题讨论】:
-
您的程序似乎可以运行:它在 fgets() 遇到 EOF 时结束。因此,如果您执行以下操作: cat file | your_program ==> 这将在文件末尾停止。如果您以交互方式进行,CTRL-D 将为 fgets() 生成 EOF 并使程序结束。那么,有什么意义呢?你能分享一个执行的例子吗?
-
您是否同意每次阅读一行时都会创建一个新的子进程这一事实?孩子在每行阅读后显示“垂死”。可能是您的问题是 while 循环的右括号,因为您可能想在循环之后分叉子项。因此,请查看位于 switch 之后(而不是之前)的 while 循环的右括号。
-
问题是我希望我的程序表现得像我不分叉任何孩子时一样。但是,考虑 10 行的输入。我希望程序读取所有 10 行并退出(打印孩子死没问题)。但是,我得到了一个输出,比如从第 1 行打印到第 10 行和第 2 行到第 10 行以及空白空间和第 2 到 10 行(永远存在)。我不知道是什么系统调用导致程序出现这种异常行为。我不想修复它,我想知道是什么原因。
-
@b.andarzian:不要评论你自己的问题,edit它来改进它!
标签: c fork stdin fgets waitpid