我正在尝试将用户输入的参数传递给execvp()
。
到目前为止,我已经分解了字符串。如果用户键入ls -a
,则temp
保存为“ls”和“-a”,后跟一个NULL字符。我不太确定如何在execvp
中正确地指出这一点。在示例中,我使用execvp(temp[position], temp)
看到了它。我知道我目前尝试的方法是错误的,但是我不确定如何正确执行!目前,我遇到了段错误。
int main(int argc, char *argv[])
{
char line[124];
int size = 124;
char *temp = NULL;
while(fgets(line, size, stdin) != NULL ) {
if (strcmp(line, "exit\n") == 0) {
exit(EXIT_SUCCESS);
}
temp = strtok(line, " ");
while (temp != NULL) {
printf("%s\n", temp);
temp = strtok(NULL, " ");
}
execvp(temp, &temp);
}
return EXIT_SUCCESS;
}
最佳答案
您的问题是temp
是单个指针,您需要将一个指针数组传递给execvp()
。
就像是:
enum { MAX_ARGS = 64 };
char *args[MAX_ARGS];
char **next = args;
temp = strtok(line, " ");
while (temp != NULL)
{
*next++ = temp;
printf("%s\n", temp);
temp = strtok(NULL, " ");
}
*next = NULL;
execvp(args[0], args);
请注意,参数列表已被赋予一个空指针作为终止符,就像
argv[argc] == NULL
中的main()
一样。显然,我跳过了错误检查(如果您传递的参数超过63个,则将溢出args
数组)。但这包含了核心思想。我不确定可能是什么问题,所有这些对我来说都是有效的:
ls
ls -l
ls -l madump.c
(其中madump.c
恰好是我正在测试的目录中的文件)我使用的代码是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
char line[1024];
while (fgets(line, sizeof(line), stdin) != NULL)
{
if (strcmp(line, "exit\n") == 0)
exit(EXIT_SUCCESS);
char *args[64];
char **next = args;
char *temp = strtok(line, " \n");
while (temp != NULL)
{
*next++ = temp;
printf("%s\n", temp);
temp = strtok(NULL, " \n");
}
*next = NULL;
puts("Checking:");
for (next = args; *next != 0; next++)
puts(*next);
execvp(args[0], args);
}
return EXIT_SUCCESS;
}
请注意,在创建目录名称后带有换行符的目录之后,我将
\n
添加到strtok()
token 列表中。对烦人的 friend 和令人困惑的半受过教育的敌人很有好处,但从其他大多数角度来看却很讨厌。请注意,我实际上是如何打印出将要传递给execvp()
的数据的。通常,我会使用printf("<<%s>>\n", *next);
而不是puts()
来明确指示参数的开始和结束位置。运行命令(
doit
)的输出为:$ ./doit
ls -l madump.c
ls
-l
madump.c
Checking:
ls
-l
madump.c
-rw-r--r-- 1 jleffler staff 2352 Jul 28 2011 madump.c
$
您从您的版本中学到了什么?
关于c - 从用户输入将数组传递给execvp(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15539708/