我有以下代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
// child process is forked.
// the child executes "ls -al"
// the parent process "waits" for the child and collects it
int main(void) {
char *args[3];
pid_t pid;
printf("i am a parrent and my pid=%d\n",getpid());
if ((pid = fork()) < 0)
fprintf(stderr, "fork error");
else if (pid == 0) {
/* child */
printf("i am a child and my pid=%d",getpid());
args[0] = strdup("ls");
args[1] = strdup("-al");
args[2] = NULL;
if (execvp(args[0], args) < 0)
fprintf(stderr, "exec error");
}
printf("my child got pid=%d\n",pid);
/* parent */
if (waitpid(pid, NULL, 0) < 0)
fprintf(stderr, "waitpid error");
exit(0);
}
导致此输出:
i am a parrent and my pid=11745
my child got pid=11750
total 144
drwxr--r-- 3 student student 4096 Jun 25 21:18 .
drwxrwxr-x 4 student student 4096 May 24 17:18 ..
其他一些文件......
我的问题是:
为什么孩子的printf ("i am a child...")
输出没有显示在控制台中,ls
的输出是?如何在与父进程相同的控制台上显示它?
答案 0 :(得分:0)
首先,您需要fflush(stdout);
之前的fork
,否则您可能会输出
您是父母和孩子的标准缓冲区中的printf("i am a parrent and my pid=%d\n",getpid());
。
然后,在fflush(stdout)
调用之前,您需要fcloseall()
或exec
,因为exec
会完全浪费您的旧过程映像,并且输出缓冲区会随之丢失。
或者,您可以切换到线路缓冲或关闭它。
在处理exec
错误时,除了打印错误之外,您还应该_exit
,否则它将继续沿着父级路线继续。