c - 如果我不刷新缓冲区,execlp 将失败
问题描述
我正在尝试在 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
程序接管并且printf()
永远不应调用第 8 行。
这与我在上面发布的代码段按预期工作,并且我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);
}
}
推荐阅读
- vba - 有没有办法,当声明一个变量来限制它的可能值?
- java - 使用 Postgres docker 实例运行 Spring Boot docker 实例
- android - Visual Studio 如何在 Android/Xamarin 调试运行期间禁用 VS 输出窗口的自动滚动到底部?
- windows - 如何将 Docker Desktop 添加到 Windows 中的服务
- r - 在列中查找所有时间的最近时间
- django - Django:如何创建组?
- blazored - Blazored/LocalStorage 在服务类中工作?
- python - 如何在另一个 Celery 任务中获取 Celery 任务的结果?
- python - CS50“DNA”:如何加快我的第 6 周“dna.py”程序?
- python - 如何重命名字典中的键并制作它的数据框?