通过多个进程从stdin读取

时间:2015-12-02 06:54:29

标签: c fork

我正在编写一个程序,其中父进程使用fork()创建N子进程(N作为参数提供),以便每个子进程直接由这一个父进行分叉。 / p>

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

./prog1 3 < fileWithText.txt

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

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()的工作方式,或者可能是我尝试读取字符串的方式。

谢谢!

1 个答案:

答案 0 :(得分:3)

如果文件太小,一个进程可以读取一个BUFSIZ(来自<stdio.h>)字节的单位,则其他进程无需读取任何内容。使输入文件更大 - 是BUFSIZ大小的倍数 - 并确保客户端在获得缓冲区满后读取的速度足够慢,并且您将看到它们都在处理它。

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