C:execvp()和命令行参数

时间:2014-02-20 01:02:34

标签: c execvp

所以我正在编写一个程序,其中参数如下

program start emacs file.c

甚至

program wait

本质上,第一个参数(argv [0])是程序名称,后跟用户输入。

在我的代码中,我调用了execvp。事实上,我并不完全确定我正在调用正确的论据。

if (pid == 0) { 
                    execvp(argv[1], argv); //Line of interest
                    exit(1);
                    }

是argv [1]和argv传递上述功能的正确参数?我查看了手册页,它们有意义,但对于这种情况可能不正确。 谢谢!

3 个答案:

答案 0 :(得分:2)

在你的主体中,argv在第一个例子中将是这样的:

argv[0] = "program";
argv[1] = "start";
argv[2] = "emacs";
argv[3] = "file.c";
argv[4] = NULL;

在execv中你想用args“emacs file.c”执行程序“start”,对吧?然后第一个参数应该是argv [1] - “start”,第二个参数应该是带有这个字符串的数组:{“start”,“emacs”,“file.c”,NULL}。如果使用argv,则在argv [0]中包含“program”字符串。

您可以创建一个新数组并复制这些参数或使用argv [1]的地址,如下所示:

execvp(argv[1], &argv[1]); //Line of interest

答案 1 :(得分:1)

唯一可能是问题的是,传递给argv[0]的{​​{1}}中的argvexecvp(第一个参数)不匹配。否则,它看起来没问题。

想象一下,调用argv[1]。在您的程序中,argv将为program cat file.txt。然后,在cat中,即使被调用的二进制文件是cat,argv仍然是{"program", "cat", "file.txt", NULL}

由于{"program", "cat", "file.txt", NULL}尝试打开并将每个参数作为文件读取,因此它将尝试打开的第一个文件是catcat),这不是所需的行为

简单的解决方案是使用argv[1] - 这实际上将参数数组向左移动了一个元素。

答案 2 :(得分:1)

我的理解是您希望根据第二个命令行参数(argv[1])执行特定操作。如果第二个参数是'start',那么你的程序应该使用之后提供的参数启动名为argv[2]的可执行文件(对吗?)。在这种情况下,您应该为execvp提供可执行文件名称(argv[2])[1]和参数列表,这些参数按照惯例以可执行文件的名称(argv[2])开头。

execvp(argv[2], &argv[2])将实现我们在上一段中描述的内容(假设这是您打算做的)。

如你所知,

[1] execvp需要2个参数。第一个是文件名;如果指定的文件名不包含斜杠字符(/),execvp将在PATH环境变量(包含可执行文件所在的目录列表)中进行查找,以查找可执行文件的完全限定名称。第二个参数是一个命令行参数列表,它在程序启动时可用。