C - 分段错误 Unix 外壳



我有一个学校作业,我必须创建一个可以执行以下操作的 shell:

  1. 读取传入命令,解析命令的每个部分
  2. 分叉子进程并执行每个命令,而无需 (<>>> |)
  3. 使用<、>>>成功执行每个命令
  4. 使用 | 成功执行每个命令

我严重迷路了...我是壳牌的新手,我不知道从这里开始做什么。我的代码给了我一个错误,说明segmentation fault (core dumped).任何和所有的帮助将不胜感激。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define MAX_ARG 10
int main()
{
        char line [256];
        char prompt[] = "sh2 % ";
        char command[256], *args[MAX_ARG];
        int pid;
        char status;
        int i;
        /* spit out the prompt */
        printf("%s", prompt );
        while( fgets(line, sizeof line, stdin) != NULL)
        {
                /* fgets leaves 'n' in input buffer. ditch it */
                line [strlen(line)-1] = '';    
                while (line !=  NULL)
                {
                        //parse command and arg
                        args[0] = strtok(line, " "); //grab command
                        for (i=1; i<MAX_ARG; i++)       //grab arguments, to assume max = 10?
                        {
                                  //if a single command with arguments then set command & argument
                                //for (i>0)
                                {
                                        // check to see if the command is 'exit'
                                        if(!strcmp("exit", args[i]))
                                        {
                                                exit(0);
                                        }
                                        {
                                                int p[2];
                                            pipe(p)
                                            if (fork() == 0) //child
                                            {
                                                    close (0);
                                                    dup(p[0]);
                                                    exec("cmd2");
                                            }
                                            else
                                            {
                                                    close(1);
                                                    close(p[0]);
                                                    close(p[1]);
                                                    dup(p[1]);
                                                    exec("cmd1");
                                    }
                                            close(0);
                                            open("stdout.txt", "r");
                                            if (fork()== 0)
                                            {
                                                    exec("cmd3");
                                            }
                                    }
                                    else if (!strcmp(">", args[i]))
                                            open("stderr.txt". "w")
                                            if (fork() == 0)
                                            {
                                                    exec("cmd1");
                                            }
                                    }
                                    else if (!strcmp(">>", args[i]))
                                    {
                                            close(1);
                                            open("stdout_stderr.txt", "w");
                                            if (fork() == 0)
                                            {
                                                    close(2);
                                                    dup(1);
                                                    exec("cmd2");
                                            }
                                    }
                                    else
                                    {
                                            pid = fork();
                                            if (pid == 0)
                                            {
                                                    status = execvp(command,args);
                                                    exit(0);
                                            }
                                            else
                                            {
                                                    waitpid(-1);
                                            }
                                    }
                            }
                    }
            }
    }
    return 0;
}

你的程序有很多错误,所以很难指出一行并说改变它。 我认为你试图一次做太多,而不是建立在坚实的基础上。

在编程中,你想从小处着手,在你的进步的基础上再接再厉,你的教授帮了你一个忙,把步骤排成一排:

  1. 读取传入命令,解析命令的每个部分
  2. 分叉子进程并在没有 (<>>> |) 的情况下执行每个命令
  3. 成功执行每个命令都带有<、>>>
  4. 使用 | 成功执行每个命令

尝试让 #1 工作,以便继续使用 #2,正如在使用函数之前提到的,这将有很大帮助。 我建议 http://bytes.com/topic/c/answers/215994-writing-shell-c 看看这篇文章,它将为您提供一个简单的外壳,您可以从中建模。 这是一个基线解析器,可让您开始使用#1(基于提到的帖子)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char line[4096] = {0};
char safeline[4096] = {0};
int done = 0;
int i = 0;
char *s = line;
char **t = NULL;
char *prompt = ">";
char *args = NULL;
char *nl = NULL;
int main(void)
{
  while(!done)
  {
    printf("%s", prompt);
    fflush(stdout);
    if(NULL == fgets(line, sizeof line, stdin))
    {
      t = NULL;
      done = 1;
    }
    else
    {
      nl = strchr(line, 'n');
      if(nl != NULL)
      {
        *nl = '';
        strcpy(safeline, line);
      }
      else
      {
        int ch;
        printf("Line too long! Ignored.n");
        while((ch = getchar()) != 'n' && ch != EOF)
        {
          continue;
        }
        if(ch == EOF)
        {
          done = 1;
        }
      }
      args = strchr(line, ' ');
      if(args != NULL)
      {
        *args++ = '';
      }
      if(!done)
      {
        printf("command -  %s :  args - %sn",s, args);
      }
   }
  }
}

相关内容

  • 没有找到相关文章

最新更新