C 通过多个进程读取标准数据

C 通过多个进程读取标准数据,c,fork,C,Fork,我正在编写一个程序,其中父进程使用fork()来创建N子进程(N作为参数提供),这样每个子进程都直接由这一个父进程分叉 每个子进程都需要从stdin中读取一行,然后打印到屏幕上。 编译和执行程序后,通过如下文本文件提供文本: /prog13

我正在编写一个程序,其中父进程使用
fork()
来创建
N
子进程(N作为参数提供),这样每个子进程都直接由这一个父进程分叉

每个子进程都需要从stdin中读取一行,然后打印到屏幕上。 编译和执行程序后,通过如下文本文件提供文本:

/prog13

我的问题是,我希望看到每个孩子都为阅读输入而“斗争”,然而我实际看到的是,总是只有一个子进程负责处理输入。这是我用于子进程的代码:

void do_child_reader(int j) {
  int pid;
  int counter = 0;
  char* buffer;
  char* readCheck;
  int readerRunning = TRUE;

  pid = getpid();
  buffer = (char*)malloc(BUFFER_SIZE * sizeof(char));

  while (readerRunning == TRUE) {
    readCheck = fgets(buffer, BUFFER_SIZE, stdin);
    if (readCheck == NULL) {
      readerRunning = FALSE;
    }
    else {
      fprintf(stdout, "(READER %d pid-%d) %s", j, pid, buffer);
      counter++;
    }
  }

  fprintf(stderr, "(READER %d pid-%d) processed %d messages, going to exit\n", j, pid, counter);
  free(buffer);
  exit(counter);
}
以下是运行N=3时得到的输出:

(READER 0 pid-72655) I am a message - line 1
(READER 0 pid-72655) I am a message - line 2
(READER 0 pid-72655) I am a message - line 3
(READER 0 pid-72655) processed 3 messages, going to exit
(READER 1 pid-72657) processed 0 messages, going to exit
(READER 2 pid-72659) processed 0 messages, going to exit
父进程正在等待子进程完成,然后退出

我正在试图找出导致这种行为的原因,以及它是以
fgets()
的方式工作,还是以我试图读取字符串的方式工作


谢谢大家!

如果文件太小,一个进程可以读取一个单位的
BUFSIZ
(来自
)字节,那么其他进程就没有什么可读取的了。将输入文件放大几倍(大小是BUFSIZ的几倍),并确保客户端在缓冲区满后读取速度足够慢,您将看到他们都在处理该文件


这是您的I/O缓冲。您可以尝试使用
setvbuf()
设置输入的行缓冲;我不确定它是否会工作。

与您的问题无关,但您动态分配
缓冲区有什么原因吗?你不能使用数组吗?另外,在使用
exit
变量时要小心,C规范只指定
exit\u SUCCESS
(它为零)和
exit\u FAILURE
(它是
1
)。POSIX允许8位无符号值(即
0
255
)(它实际上是按位和
0xff
)。谢谢,我相信你是对的-我可以使用数组。我认为这是以前试图理解这个问题的结果。我猜您的子进程不会因为缓冲而争夺输入:所有输入都在一个块中传递给第一个块。你为什么需要他们战斗?:)非常感谢。这回答了我的问题,并把拼图的各个部分放在一起。当然,在将输入文件放大并让进程在输入后休眠之后,我看到所有进程中的所有读卡器都在工作。我确信在代码继续执行之前一次读取一行,并且不知道缓冲区。再次感谢!