tee 命令实现

Posted luo-ruida

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tee 命令实现相关的知识,希望对你有一定的参考价值。

最近在温习《Linux/UNIX 系统编程手册》,正好补一补薄弱的linux和C的知识。

以下为题的要求:

 

代码:

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <errno.h>
  5 #include <sys/types.h>
  6 #include <fcntl.h>
  7 #include <string.h>
  8 
  9 #define FILE_LENGTH 255
 10 #define CONTENT_LENGTH 1000
 11 
 12 void printHelpMsg();
 13 void errorExit(const char *errormsg);
 14 
 15 int main(int argc, char *argv[])
 16 {
 17     int res;
 18     int fdSrc,fdDst;
 19     int readnum, writenum;//实际读到的字节数
 20     int isappend = 0 ;  // 0----若文件存在,则覆盖, 1---若文件存在,则追加
 21     char *optstr = "a";
 22     int DstFlag = O_RDWR | O_CREAT;
 23     char DstFile[FILE_LENGTH];
 24     char SrcFile[FILE_LENGTH];
 25     char SrcContent[CONTENT_LENGTH] = {0};
 26     char DscContent[CONTENT_LENGTH] = {0};
 27     
 28     //命令行参数校验
 29     if (argc < 3)
 30     {        
 31         printHelpMsg();
 32         exit(-1);
 33     }
 34     
 35     strncpy(SrcFile, argv[1], FILE_LENGTH - 1);
 36     strncpy(DstFile, argv[2], FILE_LENGTH - 1);
 37     SrcFile[FILE_LENGTH - 1] = \'\\0\';
 38     DstFile[FILE_LENGTH - 1] = \'\\0\';
 39     
 40     //读取命令行参数
 41     while ((res = getopt(argc, argv, optstr)) != -1)
 42     {
 43         switch (res)
 44         {
 45             case \'a\':
 46                 isappend = 1;
 47                 break;
 48             case \'h\':
 49                 printHelpMsg();
 50                 break;
 51             default:
 52                 printf("unknown option\\n");
 53                 exit(-1);
 54         }
 55     }
 56     
 57     //追加or覆盖
 58     if (0 == isappend)
 59     {
 60         DstFlag |= O_TRUNC;
 61     }
 62     else 
 63     {
 64         DstFlag |= O_APPEND;
 65     }
 66     
 67     //打开source file
 68     fdSrc = open(SrcFile, O_RDONLY, 0);
 69     if (fdSrc <  0)
 70     {
 71         errorExit("open Srcfile failed");
 72     }
 73     
 74     //读source file
 75     readnum = read(fdSrc, SrcContent, CONTENT_LENGTH);
 76     if (readnum < 0)
 77     {
 78         errorExit("read Srcfile failed");
 79     }
 80     
 81     //关闭 source file
 82     res = close(fdSrc);
 83     if (res < 0)
 84     {
 85         errorExit("close Srcfile failed");
 86     }
 87     SrcContent[CONTENT_LENGTH - 1] = \'\\0\';
 88     
 89     //打印至标准输出
 90     printf("%s", SrcContent);
 91     
 92     //打开dst file
 93     fdDst = open(DstFile, DstFlag, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
 94     if (fdDst < 0)
 95     {
 96         errorExit("open Dstfile failed");
 97     }
 98     
 99     //写文件
100     writenum = write(fdDst, SrcContent, readnum);
101     if ( writenum != readnum)
102     {
103         errorExit("write Dstfile failed");
104     }
105     
106     //关闭dst file
107     res = close(fdDst);
108     if (res < 0)
109     {
110         errorExit("close Srcfile failed");
111     }
112     
113     exit(0);
114 }
115 
116 void printHelpMsg()
117 {
118     printf("Usage is mytee [source file]  [des file]  [options] \\n");
119 }
120 
121 void errorExit(const char *errormsg)
122 {
123     printf("error: %s\\n errno=%d\\n", errormsg , errno);
124     exit(-1);
125 }

 

以上是关于tee 命令实现的主要内容,如果未能解决你的问题,请参考以下文章

管道命令输出到 tee 但也保存命令的退出代码 [重复]

Linux tee命令使用详解分享

tee命令

shell编程之tee命令和paste命令:数据输出命令

tee命令用法

tee命令