获取用户输入然后执行 execvp

Take user input and then do execvp

所以我有以下 C 代码,它要求用户给出命令(在 unix 中有效),然后我必须获取字符串并将其拆分为数组以执行用户给出的命令与 execvp()。它可以编译,但 execvp 似乎不起作用。我在数组中拆分用户输入的方式有问题吗? PS: 有些内容不是必需的,但这不是最终程序。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>

main() {

  char str[64];
  int i =0;
  char *p = strtok(str," ");

  printf("Please give me a Unix command! :\n");
  gets(str);
  char  *array[sizeof(str)];
  while (p!=NULL) {
    array[i++] = p;
    p = strtok (NULL, " ");
  }

execvp(str ,array);
perror("execvp");
}

我 运行 得到的输出是:

Please give me a Unix command! :
ls -l
execvp: No such file or directory

我在这里看到的第一个问题是

char *p = strtok(str," ");

因为您正在尝试读取不确定的值。 str 未初始化,无法保证那里存在 null-terminator,这使得它成为 字符串 。所以,你实际上是在调用 undefined behavior.

也就是说,

  • gets(), it is dangerous as it lead to buffer overflow. use fgets() 代替。
  • 对于一个数组变量,sizeof(str) 不会给你内容的大小,它returns你是整个数组的大小。您可能想使用 strlen() 来获取 字符串的长度 ,但请记住,strlen() 不计算 null-terminator.

您在 str 有任何信息之前打电话给 strtok(str, " ")

输入后直接调用:

main() {
  char str[64];
  char *array[sizeof(str)];
  char *p = NULL;
  int i = 0;

  printf("Please give me a Unix command! :\n");
  fgets(str, sizeof(str), stdin);  // Use fgets instead of gets.

  p = strtok(str," ");

  while (p != NULL) {
    array[i++] = p;
    p = strtok(NULL, " ");
  }

  execvp(str, array);
}