自主shell,支持输入/输出/追加重定向

本文详细介绍了如何使用Shell脚本实现输入输出追加重定向的功能,包括解析输入命令、判断重定向符号并执行相应的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值