#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
void main()
{
int i = 1;
pid_t child_pid;
printf("The main program process ID is %d", (int) getpid());
printf("%d", i);
child_pid = fork();
if (child_pid != 0) {
i++;
printf("%d", i);
printf("This is the parent process, with ID %d \n", (int) getpid());
printf("The child process is %d ", (int) child_pid);
} else {
printf("%d", i);
printf("This is the child process, with ID %d \n", (int) getpid());
}
}
我正在使用C语言运行此程序,使用fork()
函数。据我了解,当进程调用fork()
时,会创建一个称为子进程的重复进程。
父进程从fork()
被调用的点开始继续执行,子进程也从同一个地方执行相同的程序。
因此,当我运行程序时,我希望输出类似于以下文本:
The main program process ID is 181411This is the child process, with ID 1815
The main program process ID is 18142This is the parent process,with ID 1814
The child process is 1815
但实际上我看到了这个输出:
The main program process ID is 181411This is the child process, with ID 1815
The main program process ID is 181412This is the parent process,with ID 1814
The child process is 1815
这意味着孩子首先执行程序!
当我将\n
放在每个printf
语句的末尾时,输出是正确的!!!
我在Fedora v12和rhel 5发行版上尝试过它。
\n
和fork()
操作之间是否存在逻辑关系?我怎么能解决这个问题?
答案 0 :(得分:4)
问题是输出是行缓冲的,并且在输出\n
或在stdout上显式调用fflush
之前,它不会真正刷新到您的屏幕。 (也就是说,无法保证在输出内容时哪个过程会更快)。
答案 1 :(得分:3)
stdout
通常是行缓冲的。因此,在收到'\n'
时,要打印的文本将刷新到控制台。
首先写入哪个进程是由操作系统不确定地处理的。
要打印出来的东西,而不需要'\n'
使用strerr
触发它是一个选项,因为它通常是无缓冲的。
答案 2 :(得分:0)
我的经验是使用stderr作为fprintf(stderr,......)总是出现写无缓冲输出。在段错误停止执行之前,我能够打印行的内容。用stderr再试一次。
答案 3 :(得分:0)
您可以使用:
setbuf(stdout, NULL)
在stdout流中设置无缓冲的输出。