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)