我正在尝试在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)
?
以下建议的代码:
stderr
execlp()
main()
函数使用C编程语言标准中定义的有效签名fork()
返回的值进行假设和现在,建议的代码:
#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);
}
}