fork()和write命令

时间:2014-05-30 12:16:08

标签: c fork wait

#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
    }
}

我有这种简单的代码和平。我的问题是为什么我们不在控制台上看到父进程中的第一个打印?

4 个答案:

答案 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)

您的代码有两个问题:

  1. 首先您需要刷新输出,方法是在字符串中添加\n或致电fflush(stdout)
  2. 但它应该是exec()的儿子的工作,当然你总是可以在父母身上执行,但这可能不是你想要的。
  3. 更常见的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  
      }
    }