execvp() - 不支持的 SysV 选项
execvp() - unsupported SysV option
我正在尝试用 C 编写一个简单的 shell,它接受一个命令并使用一个子进程来执行该命令。例如,如果我输入:
ps -ael
我的子进程应该执行该命令及其参数。我打印出存储在数组中的命令。这是我看到的:
Array[0] = ps
Array[1] = -ael
Array[2] = NULL
当我执行时,我得到这个:
error: unsupported SysV option
Usage:
ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).
下面是我的代码。
int main(void)
{
char *args[MAX_LINE/2 +1]; // command line arguments
char *cmdLine;
int should_run = 1; // flag to determine when to exit the program
int i, x;
printf("osh> ");
fflush(stdout);
fgets(cmdLine, MAX_LINE, stdin);
char *token = strtok(cmdLine, " ");
int position = 0;
while (token != NULL)
{
args[position++] = token;
token = strtok(NULL, " ");
}
i = 0;
while (args[i] != NULL)
{
printf("Array[%d] = %s\n", i, args[i]);
i++;
}
if (args[i] == NULL) printf("Array[%d] = NULL", i);
x = 0;
pid_t pid;
/* fork a child process*/
pid = fork();
if (pid < 0)
{
/*Error occured*/
fprintf(stderr, "Fork failed.");
return 1;
}
else if (pid == 0)
{
/*child process*/
execvp(args[0], args); //error here
}
else
{
/*Parent process*/
wait(NULL);
printf("\nChild complete\n");
}
}
fgets()
返回的字符串包含换行符,但您并未将其从字符串中删除。因此,您将 args[1]
设置为 "-ael\n"
,而 \n
不是有效选项。
在您的 strtok()
分隔符中包含换行符:
char *token = strtok(cmdLine, " \n");
int position = 0;
while (token != NULL)
{
args[position++] = token;
token = strtok(NULL, " \n");
}
以后不计入代币
你应该能在你的输出中看到这个,我敢打赌它被打印出来了:
Array[0] = ps
Array[1] = -ael
Array[2] = NULL
那里有一个空行。
顺便说一句,我没看到你在哪里将最后一个参数设置为 NULL
。 while
循环在 strtok()
returns NULL
时停止,因此它永远不会将该结果分配给 args[position++]
。您需要添加:
args[position] = NULL;
循环后
并且不需要 if (args[i] == NULL)
-- 当满足该条件时,之前的循环停止,因此它保证为真。
我正在尝试用 C 编写一个简单的 shell,它接受一个命令并使用一个子进程来执行该命令。例如,如果我输入:
ps -ael
我的子进程应该执行该命令及其参数。我打印出存储在数组中的命令。这是我看到的:
Array[0] = ps
Array[1] = -ael
Array[2] = NULL
当我执行时,我得到这个:
error: unsupported SysV option
Usage:
ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).
下面是我的代码。
int main(void)
{
char *args[MAX_LINE/2 +1]; // command line arguments
char *cmdLine;
int should_run = 1; // flag to determine when to exit the program
int i, x;
printf("osh> ");
fflush(stdout);
fgets(cmdLine, MAX_LINE, stdin);
char *token = strtok(cmdLine, " ");
int position = 0;
while (token != NULL)
{
args[position++] = token;
token = strtok(NULL, " ");
}
i = 0;
while (args[i] != NULL)
{
printf("Array[%d] = %s\n", i, args[i]);
i++;
}
if (args[i] == NULL) printf("Array[%d] = NULL", i);
x = 0;
pid_t pid;
/* fork a child process*/
pid = fork();
if (pid < 0)
{
/*Error occured*/
fprintf(stderr, "Fork failed.");
return 1;
}
else if (pid == 0)
{
/*child process*/
execvp(args[0], args); //error here
}
else
{
/*Parent process*/
wait(NULL);
printf("\nChild complete\n");
}
}
fgets()
返回的字符串包含换行符,但您并未将其从字符串中删除。因此,您将 args[1]
设置为 "-ael\n"
,而 \n
不是有效选项。
在您的 strtok()
分隔符中包含换行符:
char *token = strtok(cmdLine, " \n");
int position = 0;
while (token != NULL)
{
args[position++] = token;
token = strtok(NULL, " \n");
}
以后不计入代币
你应该能在你的输出中看到这个,我敢打赌它被打印出来了:
Array[0] = ps
Array[1] = -ael
Array[2] = NULL
那里有一个空行。
顺便说一句,我没看到你在哪里将最后一个参数设置为 NULL
。 while
循环在 strtok()
returns NULL
时停止,因此它永远不会将该结果分配给 args[position++]
。您需要添加:
args[position] = NULL;
循环后
并且不需要 if (args[i] == NULL)
-- 当满足该条件时,之前的循环停止,因此它保证为真。