gpt4 book ai didi

c - 多个进程从标准输入读取

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:09 25 4
gpt4 key购买 nike

我正在编写一个程序,其中父进程使用 fork()创建N子进程(N 作为参数提供),因此每个子进程都直接由这个父进程派生。

每个子进程都需要从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()有效,或者可能以我尝试读取字符串的方式。

谢谢!

最佳答案

如果文件太小以至于一个单位的BUFSIZ (来自 <stdio.h> )字节可以被一个进程读取,其他进程没有任何东西可以读取。使输入文件更大——是 BUFSIZ 大小的多倍— 并确保客户端在缓冲区已满后读取速度足够慢,您会看到它们都在处理它。

这是为您准备的 I/O 缓冲。你可以尝试弄乱 setvbuf()在输入上设置行缓冲;我不确定它是否有效。

关于c - 多个进程从标准输入读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34036642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com