如何使用execve将参数(这是一个命令而不是文件名)传递给新的shell?

时间:2017-09-22 12:46:54

标签: c linux execv

我正在尝试将参数(例如:ls,date,cal)发送到新shell,执行这些参数并终止。

  #include"header.h"  //includes all the header files

 int main(int argc,char * argv[],char *envp[]) {
     char *ap[]={"sh","ls",NULL};
     int p=execve("/bin/sh",ap,envp);
     printf("error:%d",p);

     perror("execve");

 }

输出:

sh:0:can't open ls

1 个答案:

答案 0 :(得分:4)

这与execve无关。您的程序正确调用sh ls

只是sh将其第一个参数解释为要运行的shell脚本的名称,但当前目录中没有名为ls的文件,因此出现错误。通过手动运行sh ls,您将获得相同的结果。

如果您只想运行ls,为什么要通过shell呢?只是做:

char *ap[]={"ls",NULL};
int p=execve("/usr/bin/ls",ap,envp);

另一方面,如果你想使用shell,你需要告诉它它的参数应该是一个命令,而不是一个文件的名称。您可以使用sh -c ls执行此操作:

char *ap[]={"sh","-c","ls",NULL};