首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写linux shell

问编写linux shell
EN

Stack Overflow用户
提问于 2011-07-09 03:48:53
回答 2查看 5K关注 0票数 2

我正在努力学习Unix C,并做一些练习来练习。我目前正在编写自己的shell,它的工作原理类似于linux bash shell。

下面的代码提供了一个相当基本的shell。它现在提供I/O重定向。我正在尝试添加对管道的支持。最初,我只想添加对单个管道的支持。

我试着在网上浏览了一些教程,但不知道从哪里开始。

目前,下面的shell可以处理如下命令。ls > abc,cat< file1 > file2等。

代码语言:javascript
复制
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <sys/wait.h>
#include <fcntl.h>

#define TRUE 1

int main(void)
{
   char *arg_list[10];

   int status;

   int counter = 0;

   int counter2 = 0;

   pid_t pid;
   char buf[100];

   char inFile[10];
   char outFile[10];

   int fdIn, fdOut;
   while(TRUE)
   {
      printf("> ");
      if (!fgets(buf, 100, stdin))
      return 0;

      pid = fork();
      switch(pid)
      {
      case -1:
      return 1;

      case 0:
      {
      arg_list[counter] = strtok(buf, " \n");

      counter = 0;

      while(arg_list[counter] != NULL)
      {
       counter++;
       arg_list[counter] = strtok(NULL, " \n");
      }

      counter2 = 0;

      while(arg_list[counter2] != NULL)
     {
       if(!strcmp(arg_list[counter2], "<"))
       {
         if(arg_list[counter2+1] != NULL)
         {
           fdIn = open(arg_list[counter2+1], O_RDONLY);
           dup2(fdIn, STDIN_FILENO);
         }
         else
         {
           printf("No input file specified");
         }
         arg_list[counter2] = 0;
       }
       else if(!strcmp(arg_list[counter2], ">"))
       {
         if(arg_list[counter2+1] != NULL)
         {
         fdOut = open(arg_list[counter2+1], O_CREAT | O_WRONLY | O_TRUNC, 0666);
           dup2(fdOut, STDOUT_FILENO);
         }
         else
         {
           printf("No output file specified");
         }
         arg_list[counter2] = 0;
       }
       counter2++;
     }

    execvp(arg_list[0], arg_list);
    break;
  }

  default:
  waitpid(-1, &status, 0);
  break;
  }
}

  return 0;
}

如果有人能给我指明正确的方向,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2011-07-09 11:17:17

在使用dup2() (成功)之后,您将为一个文件打开两个文件描述符。您需要关闭原始文件描述符;执行的进程不应该打开额外的文件描述符。

在使用dup2()之前,您还需要以适当的方式打开文件。在其他方面,这意味着strtok()不是一个好的选择,因为它去掉了分隔符,但您需要知道打开哪个文件进行读写)。

您还需要获取参数列表;它应该只包含命令名和空指针,而不是两个文件名。

票数 3
EN

Stack Overflow用户

发布于 2011-07-09 04:08:22

为什么需要检查命令类型?Unix shell不会特别处理任何命令;所有重定向,包括管道,都是以相同的方式处理的。需要注意的一件事是,重定向可能发生在命令中的任何位置,因此您应该首先将它们解析出来;尝试

代码语言:javascript
复制
>foo ls <bar -la

有时在贝壳里。(管道是一个明显的例外,因为它们也分隔命令;|在语法上与;相同,尽管在语义上还涉及重定向。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6629686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档