所以我正在编写一个程序,其中参数如下:
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 :(得分: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}}中的argv
与execvp
(第一个参数)不匹配。否则,它看起来没问题。
想象一下,调用argv[1]
。在您的程序中,argv将为program cat file.txt
。然后,在cat中,即使被调用的二进制文件是cat,argv仍然是{"program", "cat", "file.txt", NULL}
。
由于{"program", "cat", "file.txt", NULL}
尝试打开并将每个参数作为文件读取,因此它将尝试打开的第一个文件是cat
(cat
),这不是所需的行为
简单的解决方案是使用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环境变量(包含可执行文件所在的目录列表)中进行查找,以查找可执行文件的完全限定名称。第二个参数是一个命令行参数列表,它在程序启动时可用。