多个进程从标准输入读取
Reading from stdin by multiple processes
我正在编写一个程序,其中父进程使用 fork()
创建 N
个子进程(N 作为参数提供),因此每个子进程都直接由这个父进程派生.
每个子进程都需要从 stdin
中读取一行,然后打印到屏幕上。
编译并执行程序后,文本通过如下文本文件提供:
./prog1 3 < fileWithText.txt
我的问题是,我希望看到每个子进程 "fight" 读取输入,但我实际看到的是始终只有一个子进程负责处理输入。这是我用于子进程的代码:
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
(来自 <stdio.h>
)个字节的单位,其他进程就没有什么可读的了。使输入文件更大——BUFSIZ
大小的数倍——并确保客户端在缓冲区满后读取速度足够慢,你会看到它们都在处理它。
这是I/O为您缓冲的。您可以尝试弄乱 setvbuf()
以在输入上设置行缓冲;我不确定它是否有效。
我正在编写一个程序,其中父进程使用 fork()
创建 N
个子进程(N 作为参数提供),因此每个子进程都直接由这个父进程派生.
每个子进程都需要从 stdin
中读取一行,然后打印到屏幕上。
编译并执行程序后,文本通过如下文本文件提供:
./prog1 3 < fileWithText.txt
我的问题是,我希望看到每个子进程 "fight" 读取输入,但我实际看到的是始终只有一个子进程负责处理输入。这是我用于子进程的代码:
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
(来自 <stdio.h>
)个字节的单位,其他进程就没有什么可读的了。使输入文件更大——BUFSIZ
大小的数倍——并确保客户端在缓冲区满后读取速度足够慢,你会看到它们都在处理它。
这是I/O为您缓冲的。您可以尝试弄乱 setvbuf()
以在输入上设置行缓冲;我不确定它是否有效。