繁体   English   中英

C:execvp()和命令行参数

[英]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尝试打开并读取每个参数作为文件,因此它将尝试打开的第一个文件是catargv[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM