[英]C: execvp() and command line arguments
所以我正在写一个程序,其参数如下 :
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是传递上述功能的正确参数吗? 我看了手册页,它们很有意义,但对于这种情况可能并不正确。 谢谢!
在您的主体中,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
可能唯一的问题是传递给execvp
argv
中的argv[0]
与argv[1]
(第一个参数)不匹配。 否则,看起来还可以。
想象一下调用program cat file.txt
。 在您的程序中,argv将是{"program", "cat", "file.txt", NULL}
。 然后,在cat中,即使所调用的二进制文件是cat,argv仍将是{"program", "cat", "file.txt", NULL}
。
由于cat
尝试打开并读取每个参数作为文件,因此它将尝试打开的第一个文件是cat
( argv[1]
),这不是您想要的行为。
一种简单的解决方案是使用execvp(argv[1], argv+1)
-这实际上是将参数数组向左移动一个元素。
我的理解是,您希望基于第二个命令行参数( argv[1]
)采取特定的操作。 如果第二个参数是'start',则程序应使用其后提供的参数启动名为argv[2]
的可执行文件(对吗?)。 在这种情况下,你应该提供execvp
与可执行文件名( argv[2]
)[1]和参数列表,它按照惯例与可执行文件的名称开始( argv[2]
execvp(argv[2], &argv[2])
将实现我们在上一段中描述的内容(假设这是您要执行的操作)。
[1]如您所知, execvp
需要2个参数。 第一个是文件名;第二个是文件名。 如果指定的文件名不包含斜杠字符(/),则execvp
将在PATH环境变量(包含可执行文件所在目录的列表)中进行查找,以查找可执行文件的全限定名称。 第二个参数是程序启动时可使用的命令行参数列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.