#include<stdio.h>
int main()
{
if (fork())
{
wait();
printf("Now I am showing you ls -l"); // why can't we see this ?
execlp("ls","ls", "-l", 0); //gets printed second
}
else
{
printf("We are in the child process."); // gets printed first
}
}
我有这种简单的代码和平。我的问题是为什么我们不在控制台上看到父进程中的第一个打印?
答案 0 :(得分:3)
printf函数提供缓冲IO。打印到stdout时,就像你在这里一样,当你打印一个尚未完成的换行符\n
时,缓冲区通常会被刷新,所以你的字符串就位于等待打印的缓冲区中。
接下来你要做的就是调用execlp。 exec系列函数用您指定的新函数替换当前进程。缓冲区在没有被刷新的情况下丢失,因为整个过程都被替换了。
如果将\n
添加到正在打印的字符串中,您可能会看到输出。
答案 1 :(得分:1)
您必须在stdout
之前刷新execlp
。
如果您在printf末尾放置\n
(或者您致电fflush(stdout)
),您将获得正确的结果
答案 2 :(得分:0)
在交互式情况下,标准输出默认为行缓冲。并且execlp()
将替换其内存映像,因此在将输出行写入控制台之前可能会丢弃该输出行。
将print()
语句更改为
printf("Now I am showing you ls -l\n");
解决此问题。
答案 3 :(得分:0)
您的代码有两个问题:
\n
或致电fflush(stdout)
exec()
的儿子的工作,当然你总是可以在父母身上执行,但这可能不是你想要的。更常见的fork / exec示例如下:
int main() {
if (fork()) { // parent
wait(NULL); // wait his child
printf("Ok, my children finished the job\n");
exit(0);
}
else { // child
printf("We are in the child process.\n"); // gets printed first
printf("Now I am showing you ls -l\n");
execlp("ls","ls", "-l", 0); // never return from this
}
}