Linux 는 C 언어 로 간단 한 셸 을 실현 합 니 다 (1)

14174 단어
복 지 를 보 내 고 운영 체제 의 실험 내용 을 참고 할 수 있 지만 제 코드 에 도 문제 가 있 을 수 있 습 니 다.
처음에 선생님 께 서 한 시간 에 한 시간 씩 가 르 치 셨 기 때문에 그 당시 에 그 다음 에 입 출력 으로 방향 을 바 꾸 고 파이프 등 일련의 문 제 를 가 르 칠 줄 몰 랐 습 니 다. 제 취미 도 이런 부분 에 예습 을 하지 않 았 기 때문에 첫째, 코드 를 못 썼 습 니 다. 둘째, 코드 에 대해 합 리 적 인 계획 을 세우 지 않 았 고 복잡 하 게 썼 습 니 다.
코드 는 입 출력 으로 방향 을 바 꾸 고 파이프 처리 등 프로그램 을 추가 할 수 있 습 니 다.
이 코드 를 다시 쓰 라 고 하 시 면 더 잘 계획 하 실 것 같 아 요.
/*author:Samsons
  date:2015.4.10*/
#include 
#include 
#include 
#include <string.h>
#include 
#include 
#include 

#define MAX(100)
#define LEN(100)

char *arglist[MAX];  //shell     
int num;             //shell      

int execute(char* arglist[])//      
{
    int error;
    error=execvp(arglist[0],arglist);
    if (error==-1) printf("failed
"); exit(1); } char* make(char *buf)// { char *cp; cp=malloc(strlen(buf)+1); if (cp==NULL) { fprintf(stderr,"no memory
"); exit(1); } strcpy(cp,buf); return cp; } int my_system(char *buf,char *arglist[])// { int num,j,i,last; char buffer[LEN]; num=0; i=0; while (num<MAX) { if (buf[i]=='
') { arglist[num]=NULL; return num; } if (buf[i]==' ') i++; last=i; while (buf[i]!=' ' && buf[i]!='
') i++; for (j=last;jbuf[j]; buffer[j-last]='\0'; arglist[num++]=make(buffer); } } int inner(char *arglist[])// { if (strcmp(arglist[0],"exit\0")==0)//exit { exit(0); return 1; } else if (strcmp(arglist[0],"pwd\0")==0)//pwd { char buf[LEN]; getcwd(buf,sizeof(buf));// printf("Current dir is:%s
",buf); return 1; } else if (strcmp(arglist[0],"cd\0")==0)//cd { char buf[LEN]; if (chdir(arglist[1])>=0) { getcwd(buf,sizeof(buf)); printf("Current dir is:%s
",buf); } return 1; } else return 0; } void cat_in(char *q)// { char t[30]; int fd; if (q[0]=='<') { strcpy(t,q+1); fd=open(t,O_RDONLY); arglist[1]=NULL; if (fd==-1) { printf("file open failed
"); return; } dup(fd,0); close(fd); } } void cat_out(char *q)// { char t[30]; int fd; if (q[0]=='>') { strcpy(t,q+1); arglist[num-1]=NULL; num--; fd=open(t,O_CREAT|O_RDWR); if (fd==-1) { printf("file open failed
"); return; } dup2(fd,1); close(fd); } } int main() { int i,pid; char buf[LEN]; while (1) { fgets(buf,LEN,stdin);// num=my_system(buf,arglist);// int inner_flag; inner_flag=inner(arglist);// if (inner_flag==0) { pid=fork();// if (pid==0) { if (arglist[1]!=NULL) { char q[LEN]; strcpy(q,arglist[1]); cat_in(q);// } if (arglist[num-1]!=NULL) { char q[LEN]; strcpy(q,arglist[num-1]); cat_out(q);// } execute(arglist);// } waitpid(pid,NULL,0); } } return 0; }

 
다음으로 전송:https://www.cnblogs.com/samsons/p/4417349.html

좋은 웹페이지 즐겨찾기