我需要在Linux下用C语言模拟tee
命令的操作。那么tee
是如何内部工作的呢?它看起来像一个"T"形的管道,所以我应该使用管道吗?是否有一种特殊的管道?
我需要在Linux下用C语言模拟tee
命令的操作。那么tee
是如何内部工作的呢?它看起来像一个"T"形的管道,所以我应该使用管道吗?是否有一种特殊的管道?
tee 命令可以将标准输入的数据流输出到标准输出并保存在指定的文件中,它可以应用于很多不同的情况。
使用 C 语言实现很简单,只需要编写一个程序将标准输入的所有数据复制到标准输出,并基于命令行参数打开文件后使用相同的输出语句将其输出到文件中。
伪代码示例:
file f = open(argv[1])
while (! end of file stdin) {
buffer = read stdin
write stdout buffer
write f buffer
}
close(f)
我完成了这个程序!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(int argc, char *argv[]){
FILE *fp, *fp1;
char buffer;
if(argc != 4){
printf("\nError");
printf("\nSintaxis: tee [archivo1] [archivo2]\n");
exit(0);
}
if(strcmp(argv[1], "tee") == 0){
fp = fopen(argv[2], "r");
fp1 = fopen(argv[3], "w");
printf("\Content in %s:\n", argv[2]);
while(!feof(fp)){
buffer = fgetc(fp);
fputc(buffer, fp1);
printf("%c", buffer);
}
printf("\n\n%s received %s\n", argv[3], argv[2]);
fclose(fp);
fclose(fp1);
}
else
printf("\nThe first argument have to be tee\n");
}
这是我大约20年前编写的一些关于在Windows中实现TEE的代码。从那时起,我一直在使用它与各种批处理文件一起使用。请注意每行末尾的flush命令。
#include <stdio.h>
#include <share.h>
int main (int argc, char * argv[])
{
if (argc < 2 )
{
printf ("Error: No output file name given, example: theCmd 2>&1 |ltee outputFileName \n");
return 1;
}
FILE *Out = _fsopen(argv[argc-1], "a", _SH_DENYWR);
if (NULL == Out)
{
char buf[300];
sprintf_s(buf, 300, "Error openning %s", argv[argc-1]);
perror(buf);
return 1;
}
int ch;
while ( EOF != (ch=getchar()))
{
putchar(ch);
putc(ch, Out);
if ( '\n' == ch )
fflush(Out);
}
_flushall();
fclose(Out);
return 0;
}