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
)。谢谢,我相信你是对的-我可以使用数组。我认为这是以前试图理解这个问题的结果。我猜您的子进程不会因为缓冲而争夺输入:所有输入都在一个块中传递给第一个块。你为什么需要他们战斗?:)非常感谢。这回答了我的问题,并把拼图的各个部分放在一起。当然,在将输入文件放大并让进程在输入后休眠之后,我看到所有进程中的所有读卡器都在工作。我确信在代码继续执行之前一次读取一行,并且不知道缓冲区。再次感谢!