我有一个问题,我使用以下程序(fork()函数)创建一个子进程,使用execl()重载另一个程序。如果我想在execl()函数或其他类型的exec()函数中使用echo命令,我该怎么办?我使用以下程序,但它失败了!终端给了我一个警告:echo:无法访问hello world!:没有这样的文件或目录 这是父母!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{ pid_t childpid;
childpid=fork();
if(childpid==-1){
perror("failed to fork");
return 1;
}
if(childpid==0)
{
execl("/bin/ls","echo","hello world!",NULL);
perror("child failed to exec");
return 1;
}
if(childpid!=wait(NULL)){
perror("parent failed to wait due to signal or error");
return 1;
}
sleep(5);
printf("this is parent!\n");
return 0;
}
答案 0 :(得分:1)
您正在执行的命令是:
/bin/ls "echo" "hello world!"
您可能想要执行的是(假设您使用bash
):
/bin/bash -c 'echo "hello world!"'
所以使用:
execl("/bin/bash","-c","echo \"hello world!\"",NULL);
您可能希望在使用perror
之前检查错误。
编辑:
根据EOF的推荐,您应该使用system
来电而不是exec
。它处理为您创建子进程,并允许您专注于手头的任务(即调用shell命令)。可能的缺点是它在继续之前等待子进程死掉,但这很可能不是问题(不管怎么说都不是这样)。它也会忽略某些可能不合适的信号(SIGINT
和SIGQUIT
),具体取决于您设计程序的方式。