4-1:实现tee命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define BUF_SIZE 1024 void tee( char *filename) { char szBuf[BUF_SIZE]; int fd = open(filename, O_RDWR | O_CREAT | O_APPEND, 0664); while (1) { memset (szBuf, 0, BUF_SIZE); read(STDIN_FILENO, szBuf, BUF_SIZE); fprintf (stderr, "%s" , szBuf); write(fd, szBuf, strlen (szBuf)); } } int main( int argc, char **argv) { if (argc != 2 || ! strcmp (argv[1], "--help" )) { printf ( "Usage:%s [filename]\n" , argv[0]); printf ( "\tfilename:output file\n" ); return 0; } tee(argv[1]); return 0; } |
尚需学习:输入一个文件名,判断当前目录是否包含此文件。
更改后的程序,包含功能:如文件已存在,则实现-a命令行选项(tee -a file)在文件结尾处追加数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define BUF_SIZE 1024 void tee( int argc, char *filename) { char szBuf[BUF_SIZE]; int fd; if (argc == 2) { fd = open(filename, O_RDWR | O_CREAT, 0664); } if (argc == 3){ fd = open(filename, O_RDWR | O_APPEND); } while (1) { memset (szBuf, 0, BUF_SIZE); read(STDIN_FILENO, szBuf, BUF_SIZE); fprintf (stderr, "%s" , szBuf); write(fd, szBuf, strlen (szBuf)); } } int main( int argc, char **argv) { if ((argc != 2 && argc != 3) || ! strcmp (argv[1], "--help" )) { printf ( "Usage:%s [filename]\n" , argv[0]); printf ( "\tfilename:output file\n" ); return 0; } if (argc == 2) { int iRet = access(argv[1], F_OK); // 判断文件是否存在 if (iRet == 0) { printf ( "File Existed\n" ); printf ( "please use [-a] option\n" ); printf ( "Usage:%s [-a] [filename]\n" , argv[0]); return 0; } tee(argc, argv[1]); } else { tee(argc, argv[2]); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步