使用execv(C语言)从linux命令提示符运行命令

时间:2012-09-25 03:30:29

标签: c unix argv execv

到目前为止,我唯一困惑的部分是如何使用第一个参数设置execv作为当前工作目录。我试过两个“。”和“〜”,都没有对屏幕执行任何操作;同样的“/。”和“/〜”。我很困惑如何让execv运行这样的事情:
$ ./prog ls -t -al

并让它在程序执行后执行命令(存储在argv中)在当前目录中执行,或者在文件所在的目录中执行(根据使用者的不同而不同)。
我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

void main(int argc, char *argv[])
{
        int pid;
        int count = 0;
        char *argv2[argc+1];

        for(count = 0; count < argc-1; count++){
                argv2[count] = argv[count+1];
                printf("Argv2: %s\n", argv2[count]);  //just double checking
                argv2[argc-1] = NULL;
        }

        pid = fork();
        if(pid == 0){
                printf("Child's PID is %d. Parent's PID is %d\n", (int)getpid, (int)getppid());
                execv(".", argv2);       //<---- confused here
        }
        else{
        wait(pid);
        exit(0);
        }
}


一些样本输出:
$ ./prog ls -t -al
Argv2:ls
Argv2:-t
Argv2:-al
孩子的PID是19194.父母的PID是19193

6 个答案:

答案 0 :(得分:3)

我猜 execv 是需要使用的。 execvp 非常好,因为它会在您的PATH设置中查找命令。

execv(".", argv2);       //<---- confused here

...

#include <errno.h>
#include <string.h>
if ( execv(argv2[0],argv2) )
{
    printf("execv failed with error %d %s\n",errno,strerror(errno));
    return 254;  
}

wait(pid);

...

pid_t wait_status = wait(&pid);

答案 1 :(得分:1)

按照惯例,第一个参数应指向与正在执行的文件关联的文件名。 你想执行ls,所以第一个参数应该是/bin/ls,这意味着代码是

execv("/bin/ls", argv2);

你可以尝试一下

答案 2 :(得分:1)

/* main() returns int */
int main(int argc, char *argv[])
{
        int pid;

        pid = fork();
        if(pid == 0){
                printf("Child's PID is %d. Parent's PID is %d\n"
                      , (int)getpid, (int)getppid());
                execv(argv[1], argv+1);
        }
        else{
        wait(NULL);
        exit(0);
        }

        return 0;
}

更新:execv()需要可执行文件的绝对路径;对于当前目录中的文件,您必须构造该路径(例如,通过pwd())。如果你想通过$ PATH环境变量来访问可执行文件,你可以使用execvp(),它会为你完成所有的搜索。

答案 3 :(得分:0)

execv()的第一个arg不是要运行的目录,而是要执行的文件的路径。默认情况下,您执行的程序将在调用者的当前目录的上下文中运行。

答案 4 :(得分:0)

第一个参数是您要运行的程序的绝对路径;换句话说,您在终端中键入的命令的第一部分。您可以使用命令whereis找到程序的位置。此外,execv函数可以为您查找路径,这使您的代码更具可移植性。

答案 5 :(得分:0)

代码示例供您参考:

Context