【问题标题】:How can I use execl() function or other kinds of exec() functions to perform echo command?如何使用 execl() 函数或其他类型的 exec() 函数来执行 echo 命令?
【发布时间】:2015-09-24 21:49:24
【问题描述】:

我有一个问题,我使用以下程序(fork() 函数)创建子进程以使用 execl() 重载另一个程序。如果我想在 execl() 函数或其他类型的 exec() 函数中使用 echo 命令,我该怎么办?我使用以下程序,但失败了!终端给了我一个警告:echo: cannot access hello world!: No such file or directory 这是父母!

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

【问题讨论】:

  • 基本上我只是想在exec()函数中使用echo命令,并使用exec()来重载main函数,但是我不知道如何使用execl()函数来执行echo命令.我认为路径可能有问题?
  • stackoverflow.com/questions/8827939/…觉得这也能帮我解决问题!

标签: c linux unix


【解决方案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 命令)。可能的缺点是它在继续之前等待子进程死亡,但这很可能不是问题(无论如何都不是这种情况)。它还会忽略某些可能不受欢迎的信号(SIGINTSIGQUIT),具体取决于您设计程序的方式。

【讨论】:

  • 嗨,你能告诉我'-c'是什么意思吗?
  • 它基本上指定后面是命令,而不是文件名(例如脚本)。
  • 当然,使用system 可能是一个更好的主意,但作者要求提供与exec 相关的示例。可能应该在我的回答中包含这一点。
猜你喜欢
  • 2015-12-26
  • 2021-01-03
  • 1970-01-01
  • 2020-01-16
  • 2021-11-27
  • 1970-01-01
  • 2023-03-24
  • 2019-11-06
  • 1970-01-01
相关资源
最近更新 更多