分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