在以下程序中,调用fork()并创建一个子节点。我知道在printf()中使用缓冲输出时会有不可预测的输出。为了解决这个问题,我使用的是write(),它是无缓冲的。
问题是write()不会将\ n与字符串一起打印。
我已经尝试过使用setvbuf()来禁用缓冲的stdout,就像其他帖子一样,我也尝试过使用fflush(stdout)。但输出总是一样的。
当我将输出重定向到像这样的文件时
./main.out > output.txt
输出看起来不错。我理解这是有效的,因为在将输出重定向到文件时,系统通过缓冲整个输出来完成它,而不仅仅是行缓冲。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#define NO_ERROR 0
#define BUFFER_SIZE 50
void childProcess();
void parentProcess();
int main(int argc, char * argv[])
{
int pid = (int) fork();
if(pid < 0)
{
puts("Error: Fork process failed");
}
else if (pid == 0)
{
childProcess();
}
else
{
parentProcess();
}
return NO_ERROR;
}
void childProcess()
{
char buffer[BUFFER_SIZE];
int pid = (int) getpid();
sprintf(buffer, "This line is from Child pid %d\n", pid);
write(1, buffer, strlen(buffer));
}
void parentProcess()
{
char buffer[BUFFER_SIZE];
int pid = (int) getpid();
sprintf(buffer, "This line is from Parent pid %d\n", pid);
write(1, buffer, strlen(buffer));
}
Cygwin中的输出如下所示:(输出后还会打印1或2个新行)
This line is from Parent pid 20016This line is from Child pid 11784
预期产出:
This line is from Parent pid 20016
This line is from Child pid 11784
在另一台机器上测试,运行linux。输出看起来不同,但仍不如预期。提示后打印第二行。
user@server$ ./main.out
This line is from Parent pid 31599
user@server$ This line is from Child pid 31600
答案 0 :(得分:1)
你的两个进程不同步,这意味着父子同时运行。在这种情况下,输出是不可预测的。例如,您可以使用wait()
函数让父亲等待儿子的结束。
void parentProcess(void)
{
wait(NULL); // father is sleeping until his son dies
char buffer[BUFFER_SIZE];
int pid = (int) getpid();
sprintf(buffer, "This line is from Parent pid %d\n", pid);
write(1, buffer, strlen(buffer));
}