2014-02-20 91 views
0

所以我正在写一个程序,其中参数如下所示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是通过上述功能的正确参数吗?我看了手册页,他们有道理,但对于这种情况可能不正确。 谢谢!

+0

你会从答案中注意到常见主题:'execvp(cmds [n],&cmds [n]);'或者等价的。也就是说,将参数数组的第n个元素作为第一个参数传递给'execvp()',并且将参数数组的第n个元素的地址作为第二个参数传递 - 在您的具体情况下, execvp(argv [1],&argv [1]);'。很明显,你在技术上没有义务这么做(争论是独立的),但你需要一个很好的理由来做其他事情。 –

回答

2

在你的主,argv的会是这样第一个例子:

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

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

您可以创建一个新的数组和复制这些参数或使用的argv地址[1]是这样的:

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

唯一可能出现的问题是在argv传递给execvp将不匹配argv[1](第一个参数)。否则,它看起来没问题。

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

由于cat试图打开并读取每个参数作为文件,它将尝试打开的第一个文件是catargv[1]),这不是所需的行为。

简单的解决方案是使用execvp(argv[1], argv+1) - 这实质上是将参数数组左移一个元素。

1

我的理解是,你想利用基于第二命令 - 一个具体的行动行参数(argv[1])。如果第二个参数是'start',你的程序应该启动名为argv[2]的可执行文件,其后面提供的参数(对吧?)。在这种情况下,应该为execvp提供可执行文件名称(argv[2])[1]和一个参数列表,这些参数按照约定以可执行文件的名称(argv[2])开头。

execvp(argv[2], &argv[2])将执行我们在最后一段中描述的内容(假设这是您打算执行的操作)。

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

+0

根据第二个例子,我很确定'argv [1]'是预期的目标可执行文件。 – millinon