[execlp失败,如果我不刷新缓冲区

问题描述 投票:-1回答:1

我正在尝试在C的子进程中运行命令:

int main()
{
    if (fork()) {
        wait(0);
    } else {
        fflush(stdout);
        execlp("ls", "ls");
        printf("Command not found: \"%s\"\n", "ls");
    }   
}

[我的理解是,对fork()的调用将创建该进程的副本(子进程)。此处的父级将为wait(0),因为fork()不会返回null,并等待子级进程完成。

我理解子进程的图像本质上在调用ls之后“成为” execlp("ls", "ls");

[此时,如果路径中存在ls,则ls程序将接管,并且永远不应调用第8行的printf()

这与我在上面发布的代码段一样正常工作,并且在当前目录中获得了ls的输出。

但是如果我注释掉 fflush(stdout),则将调用printf()

Command not found: "ls"

如果我注释掉printf(),为什么会调用fflush(stdout)

c exec
1个回答
0
投票

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确检查错误
  4. 对于任何错误,正确地传递“您的”错误消息和系统认为错误发生的文本原因stderr
  5. 将有效的参数列表传递给execlp()
  6. 说明为什么包含每个头文件
  7. main()函数使用C编程语言标准中定义的有效签名
  8. 不对从fork()返回的值进行假设
  9. 遵循公理:每行仅一个语句,并且(最多)每个语句一个变量声明。

和现在,建议的代码:

#include <stdio.h>    // perror(), printf()
#include <stdlib.h>   // exit(), EXIT_FAILURE
#include <unistd.h>   // execlp(), fork(), pid_t
#include <sys/wait.h> // wait()


int main( void )
{
    pid_t pid = fork();

    if ( pid < 0 ) 
    {   // then error
        perror( "fork failed" );
        exit( EXIT_FAILURE );
    }

    if( pid == 0 )
    {   // then child
        execlp("ls", "ls", NULL );
        perror( "execlp failed" );
        exit( EXIT_FAILURE );
    }

    else
    {   // then parent
        wait(0);
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.