2

到目前为止,我唯一感到困惑的部分是如何使用第一个参数设置 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
Child's PID is 19194. Parent's PID is 19193
4

6 回答 6

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);
于 2012-09-25T11:19:15.997 回答
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;
}

UPDATE: execv() needs the absolute path of the executable; for files in the current directory you would have to construct that path (eg via pwd()). If you want the executable to seached via the $PATH environment variable, you could use execvp(), which does all the seaching for you.

于 2012-09-26T13:16:19.170 回答
1

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

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

你可以试试

于 2012-09-25T05:17:14.180 回答
0

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

于 2012-09-26T13:06:06.553 回答
0

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

于 2012-09-25T03:39:34.467 回答
0

代码示例供您参考:

#include <stdio.h>

int main() {

    int ret = fork();
    if(ret == 0)
    {
            char *params[4]  = {"/bin/ls", "-l",0}; //cmd params filled

            int res = execv( "/bin/ls" , params);  //parameters for cmd
            //int res = execv( "/bin/ls" , NULL);  //this is fail case (when child-exit with -1 status can be seen)
            printf("\n child exiting (%d) .. \n", res); //on successful execution of cmd, this exit never appears
        }
        else
        {
            waitpid(ret,1,0);
            printf("parent exiting\n");
    }

    return 1;
 }
于 2015-09-07T10:03:55.857 回答