通过多个进程从stdin读取
我正在编写一个程序,其中父进程使用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
单元(来自
)字节,则其他进程无需读取任何内容。 使输入文件更大 – 是BUFSIZ
大小的倍数 – 并确保客户端在获得缓冲区已满后读取的速度足够慢,您将看到它们都在处理它们。
这是I / O缓冲。 你可以尝试搞乱setvbuf()
来设置输入的行缓冲; 我不确定它会起作用。