C - Execvp + Shell

时间:2013-11-23 04:00:27

标签: c shell exec

我现在对我的程序有些困难。我正在尝试编写一个运行shell命令的程序,但我相信我使用execvp错误并传入错误的参数。当我输入ls它说无法访问时,没有这样的文件或目录?我已经看了很多例子,试图模仿它们,但没有占上风。

我的退出检查也被完全跳过了,我不相信“等待”功能正在等待。

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

int main(int args, char* argv[])
{
  char input[1024];
  char *arguments[100];
  char* directive;
  int doExit = 0;

  while(doExit != 1){
  printf("\n");
  printf("Welcome to myShell\n");
  printf("? : ");

  fgets(input, 1024, stdin);

  char *token;
  int count = 1;
  int argsCount = 1; 

  token = strtok(input, " "); 

  while(token != NULL){ 
    if(count == 1){
        directive = strdup(token);
        arguments[0] = strdup(directive); 
        ++count;
    }
    else{
        arguments[argsCount] = strdup(token); 
        ++argsCount;
    }
    token = strtok(NULL, " ");
  }
  arguments[argsCount] = '\0';

  printf("%s\n", directive);

  if(strcmp(arguments[0], "exit") == 0){
    doExit = 1;
    exit(1);
  }
  pid_t pid = fork(); // create child
  int status;
  int i = 0;
  printf("Arguments:\n");
  for(i =0; i < sizeof(arguments) && arguments[i] != NULL; ++i){
    printf("%s\n", arguments[i]);
  }

  if(pid >= 0){
    if(pid == 0){
      printf("I am the child.\n");

      printf("%s\n", directive);
      int result = execvp(directive, arguments);    
      if(result < 0){
        printf("*** ERROR: exec failed\n");
        exit(1);
      }
    }
    else if(pid >= 0){
      printf("I am the parent.\n");

        while (wait(&status) != pid){
            ;
        }
    }
  }
  else{
     printf("Error: Fork was unsuccessful.\n");
     exit(1);
  }

  printf("\n");
 }
  return 0;
}

1 个答案:

答案 0 :(得分:2)

使用:

token = strtok(input, " \n\t");

token = strtok(NULL, " \n\t");

这样input末尾的换行符将被视为令牌分隔符,不包含在令牌中。

另一个错误:

i < sizeof(arguments)

应该是:

i < sizeof(arguments)/sizeof(*arguments)

因为sizeof以字节为单位返回大小,而不是数组中元素的数量。

我建议您更改诊断printfs以在字符串周围添加字符,例如:

printf("'%s'\n", arguments[i]);

通过这种方式,您将能够判断参数中是否包含新行等额外字符。