I/O练习题:tee实现

tee命令是从标准输入中读取数据,直到文件结尾,随后将数据写入标准输出和命令行参数的文件。 使用I/O 实现tec命令。

默认情况下,若已存在于命令行参数指定文件同名的文件tec命令会将其覆盖。如果文件已存在,请实现 -a (tee -a )在文件结尾处追加数据。

 

#include<unistd.h>
#include<fcntl.h>
#define MAX_NUM 1024

int main(int argc,char *argv[])
{
        int ch;
        int flag = O_CREAT |O_RDWR;
        int mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
        // rw-rw-rw
        if(argc<2)
        {
                perror("argc<2");
                printf("usage = %s filename\n",argv[0]);
                printf("-a: append\n");
                exit(-1);
        }
        while( (ch = getopt(argc,argv,"ah") ) !=-1 )
        {

                switch(ch){
                        case 'a':
                                flag |=o_APPEND;
                                break;
                        case 'h':
                        printf("usage = %s filename\n",argv[0]);
                        printf("-a: append\n");
                        exit(-1);
                                break;
                }

        }
        const char *  file_name = argv[optind];
        //simple contrall filename  is first not -x 
        char buf[MAX_NUM];
        int num_read;
        int fd_out = open(file_name,flag,mode);
        if( fd_out<0)
        {
                perror("open errror!\n");
                exit(-1);
        }

        while( (num_read = read(0,buf,1024)) !=-1)
        {
                write(1,buf,num_read);
                write(fd_out,buf,num_read);
        }
        return 1;
}


代码写的比较简陋,对于命令行处理的很简单。

默认情况下,getopt会重新排列参数的顺序,所有不可知或者错误的命令行参数都会排在最后,optind存储第一个错误或者未知的参数的下标。

而我们的文件名正是一个未知的参数。

对于命令行参数的解析,也是件比较复杂的过程,需要单独列出来讨论。

 

这里和真实的tee比较起来,还不能处理  ctrl+d (EOF)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值