shell命令解析器二

分mina.c  my_pipe.c   my_pipe.h   my_shell.h 4个文件

/* ************************************************************************
 *       Filename:  main.c
 *    Description: 
 *        Version:  1.0
 *        Created:  2010年9月19日 11时47分58秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:  YOUR NAME ()
 *        Company: 
 * ************************************************************************/
#include"my_shell.h"
char *argv[20];
int main()
{
 while(1)
 {
  char cmd_buf[200]="";
  char cur_dir[50];
  int i = 0;
  printf("[%s@ ]$",getenv("USER"));//打印提示符号。
  fgets(cmd_buf, sizeof(cmd_buf), stdin);//获取字符串
  cmd_buf[strlen(cmd_buf)-1]='/0';   //把最后一位'/n'变成字符串结束标志'/0'
  if(cmd_buf[0]=='/0')
   continue;    //如果是输入回车的话,继续while循环
  argv[i++]=strtok(cmd_buf, " ");
  while((argv[i++]=strtok(NULL," "))!=NULL);   //字符串按空格切割  

  if(fork()==0)  //创建子进程  调用execvp运行外部命令。
  {
   i=0;
   while(argv[i]!=NULL)
   {
    if( strcmp(argv[i],"|")==0)
    {
     my_pipe(i);
    }
    i++;
   } 
   execvp(argv[0],argv);  
   printf("command no found!/n");
   exit(1);
  }
  wait(NULL);  //父进程等待子进程结束。
 }
 return 0;
}

/* ************************************************************************
 *       Filename:  my_pipe.c
 *    Description: 
 *        Version:  1.0
 *        Created:  2010年9月19日 11时47分58秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:  YOUR NAME ()
 *        Company: 
 * ************************************************************************/
void my_pipe(int i)    
{
 pid_t pid;
 int pipe_fd[2];
 if(pipe(pipe_fd)<0)
 {
  perror("pipe"); 
  exit(1);
 }
 if((pid=fork())==0)
 {
   argv[i]=NULL;
   close(pipe_fd[0]);      //关掉管道的读端
   close(1);               
   dup2(pipe_fd[1],1);    //标准输出重定向到管道的写端
   execvp(argv[0],argv);        //
 }                                                                                                                                    
 else
 {
  close(pipe_fd[1]);
  close(0);
  dup2(pipe_fd[0],0);        //标准输入重定向到管道的写端
  execvp(argv[i+1],argv+i+1);       //执行exec函数
   perror("execvp more");
 }
 printf("my_pipe error/n");
}

/* ************************************************************************
 *       Filename:  my_pipe.h
 *    Description: 
 *        Version:  1.0
 *        Created:  2010年9月19日 11时47分58秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:  YOUR NAME ()
 *        Company: 
 * ************************************************************************/

#ifndef __MY_PIPE_INCLUDE_
#define __MY_PIPE_INCLUDE_
extern void my_pipe(int i);
#endif

 

/* ************************************************************************
 *       Filename:  my_shell.h
 *    Description: 
 *        Version:  1.0
 *        Created:  2010年9月19日 11时47分58秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:  YOUR NAME ()
 *        Company: 
 * ************************************************************************/

#ifndef __MY_SHELL_INCLUDE_
#define __MY_SHELL_INCLUDE_
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>
#include "my_pipe.h"

extern char *argv[20];
#endif
------------------------------------------------Makefile-------------------------------------------------------------

#README:
#Use "make" to generate "mysh" without debug info
#Use "make dmysh" to generate "dmysh" with debug info

OBJECT=main.o  my_pipe.o
OBJ=main.obj   my_pipe.o
CC=gcc
CFLAG=-O2
DEBUG=-DDEBUG -g

mysh: $(OBJECT) my_shell.h
 $(CC) $(CFLAG) -o $@ $(OBJECT)

%.o:%.c
 $(CC) -c $(CFLAG) -o $@ $<
 
###########################################
#just for debug  
dmysh: $(OBJ) my_shell.h
 $(CC) $(CFLAG) $(DEBUG) -o $@ $(OBJ)

%.obj:%.c
 $(CC) -c $(CFLAG) $(DEBUG) -o $@ $< 
##########################################

.PHONY:clean
clean:
 @echo Clean...
 @-rm *.o *.obj mysh dmysh -f
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值