C-执行副总裁+;壳

C-执行副总裁+;壳,c,shell,exec,C,Shell,Exec,我现在的程序有点困难。我正在尝试编写一个运行shell命令的程序,但是我认为我使用了错误的execvp,并且传入了错误的参数。当我键入ls时,它会说无法访问,是否没有这样的文件或目录?我看过很多例子,并试图模仿它们,但没有成功 此外,我的退出检查被完全跳过,我不相信“等待”功能正在等待 #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #in

我现在的程序有点困难。我正在尝试编写一个运行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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int args,char*argv[])
{
字符输入[1024];
字符*参数[100];
char*指令;
int-doExit=0;
while(doExit!=1){
printf(“\n”);
printf(“欢迎来到myShell\n”);
printf(“?:”);
fgets(输入,1024,标准输入);
字符*令牌;
整数计数=1;
int argscont=1;
令牌=strtok(输入“”);
while(令牌!=NULL){
如果(计数=1){
指令=strdup(令牌);
参数[0]=strdup(指令);
++计数;
}
否则{
参数[argsCount]=strdup(令牌);
++阿格斯孔特;
}
令牌=strtok(空,“”);
}
参数[argsCount]='\0';
printf(“%s\n”,指令);
if(strcmp(参数[0],“退出”)==0){
doExit=1;
出口(1);
}
pid_t pid=fork();//创建子对象
智力状态;
int i=0;
printf(“参数:\n”);
对于(i=0;i=0){
如果(pid==0){
printf(“我是孩子。\n”);
printf(“%s\n”,指令);
int result=execvp(指令、参数);
如果(结果<0){
printf(“***错误:exec失败\n”);
出口(1);
}
}
否则如果(pid>=0){
printf(“我是父母。\n”);
while(等待(&status)!=pid){
;
}
}
}
否则{
printf(“错误:Fork未成功。\n”);
出口(1);
}
printf(“\n”);
}
返回0;
}
使用:

以及:

因此,
input
末尾的换行符将被视为令牌分隔符,而不包括在令牌中

另一个错误:

i < sizeof(arguments)

这样,您就可以知道参数中是否包含了诸如换行符之类的额外字符。

这是您2小时前在中发布的同一个程序吗?最好您进行诊断打印;不过,你可能应该在用叉子之前做。你也应该理顺你的逻辑。有三种情况:错误、子项、父项。你应该有
if(pid<0){…error…}else if(pid==0){…child…}else{…parent…}
。也许>>@Barmar:差不多,但不完全。这有一些错误的诊断打印位置。无论如何,另一个问题被删除了。您将
“ls\n”
放在
指令中,因为您的
strtok()
只使用空格作为分隔符,而不是换行符。谢谢。这解决了我只使用ls的问题,但现在当我尝试运行ls-la时,它会说参数[1]处的参数是“ls-la”,execvp返回-1并失败。您需要两次指定blank(和tab)和换行符,而不仅仅是blank或newline作为分隔符。您真的丢失了
-
?我不!我还将
fgets()
行更改为
if(fgets(input,sizeof(input),stdin)==0)中断以正常处理EOF。并不是每个人都键入
exit
退出shell。啊,对不起,这是一个输入错误。好吧,我来玩玩。我整天都埋头于ExtJS工作,C不是我的拿手好戏。。谢谢你的帮助。
token = strtok(NULL, " \n\t");
i < sizeof(arguments)
i < sizeof(arguments)/sizeof(*arguments)
printf("'%s'\n", arguments[i]);