繁体   English   中英

C - Execvp + Shell

[英]C - Execvp + Shell

我现在对我的程序有些困难。 我正在尝试编写一个运行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;
}

采用:

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]);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM