fork()程序终端输出异常:子进程输出出现在命令提示符后
为什么子进程的输出会出现在命令提示符之后?
这是个非常常见的fork进程调度问题,我来给你理清楚背后的原因:
核心原因:进程并发调度 + 父进程提前退出
当你调用fork()后,操作系统会创建一个和父进程几乎完全相同的子进程,这两个进程会独立被操作系统调度执行,它们的运行顺序是不确定的——完全取决于操作系统的进程调度算法。
如果父进程先完成执行并退出,你的shell会立刻认为当前程序已经结束,于是打印出命令提示符。但此时子进程可能还在运行,当它完成输出时,就会直接把内容打印到已经显示出来的提示符后面,就出现了你看到的现象。
另外,虽然printf默认是行缓冲(遇到换行符会刷新缓冲),但进程调度的不确定性还是可能让子进程的输出时机晚于父进程退出的时机,导致输出“追”在提示符后面。
解决方法:让父进程等待子进程完成
你可以在父进程的分支里调用wait()或waitpid(),让父进程等待子进程执行完毕后再继续运行,这样shell就不会提前打印提示符。修改后的代码如下:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> // 新增头文件,用于wait函数 void forkexample() { pid_t pidTo; int status = 0; int x = 1; pid_t pid = fork(); if (pid == 0){ printf("hello from child process %d\n",getpid()); } else{ wait(NULL); // 等待子进程执行完成 printf("hello from the parent process %d\n",getpid()); } } int main() { forkexample(); exit(0); }
运行修改后的代码,你会发现父进程会等子进程输出完毕后再输出自己的内容,最后shell才会打印提示符,输出顺序就正常了。
内容的提问来源于stack exchange,提问作者user5137130
相关产品推荐
相关产品推荐

