shell具体执行过程
编写一个支持输入输出追加重定向的shell脚本程序:
1 # include <stdio.h>
2 # include <stdlib.h>
3 # include <unistd.h>
4 # include <string.h>
5 # include <sys/wait.h>
6 # include <sys/stat.h>
7 # include <fcntl.h>
8 # define MAXLINE 1024
9
10
11 int argc=0;
12 char *argv[8];
13 int main(void)
14 {
15 char buf[MAXLINE+1];
16 while(1){
17 printf("ztq shell >");
18 memset(buf,0x00,sizeof(buf));
19 if(fgets(buf,MAXLINE,stdin)==NULL)break;
20 buf[strlen(buf)-1]='\0';
21 printf("[%s]\n",buf);
22 int flag=0;
23 argc=0;
24 int i=0;
25 for(;buf[i]!='\0';i++){
26 if(!isspace(buf[i])&&flag==0){
27 flag=1;
28 argv[argc++]=buf+i;
29 }
30 else if(isspace(buf[i])){
31 flag=0;
32 buf[i]='\0';
33 }
34 }
35 argv[argc]=NULL;
36 int j=0;
37 for(;j<argc;j++){
38 printf("argv[%d]=%s\n",j ,argv[j]);
}
40 if(fork()==0){
41 int i=0;
42 int flag=0;
43 for(;argv[i]!=NULL;++i){
44 if(strcmp(">",argv[i])==0){
45 flag=1;
46 break;
47 }
48 }
49 int copyfd;
50 argv[i]=NULL;
51 if(flag)
52 {
53 if(argv[i+1]==NULL){
54 printf("command error\n");
55 exit(1);
56 }
57 close(1);
58 int fd=open(argv[i+1],O_WRONLY | O_CREAT,0777);
59 copyfd=dup2(1,fd);//把标准输出重新定向到一个文件中
60 }
61 execvp(argv[0],argv);
62 if(flag){
63 close(1);
64 dup2(copyfd,1);
65 }
66 exit(1);
67 }
68 else{
69 wait(NULL);
70 }
71 }
72 }
