4

我必须tee在 C for Linux 中模拟命令。内部如何tee运作?它看起来像一个T形管,所以我应该使用管子吗?有没有一种特殊的管子?

4

3 回答 3

3

tee 接受标准输入并将数据流复制到标准输出以及作为选项提供的文件,它可以在许多非常不同的情况下使用。

C 中的实现非常简单,只需编写一个程序,将所有数据从 stdin 复制到 stdout,而且在基于命令行参数打开的文件上使用相同的输出语句用于 stdout。

基本上在伪代码中:

file f = open(argv[1])
while (! end of file stdin) {
  buffer = read stdin
  write stdout buffer
  write f buffer
}
close(f)

请注意,您实际上不必对管道做任何事情,您的 shell 将整理管道,程序只需将数据从一个流复制到另外两个流。

于 2012-09-13T03:20:29.617 回答
1

我完成了程序!

#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");
}
于 2012-09-14T04:51:33.620 回答
1

这是我大约 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;
}
于 2020-11-17T22:17:50.423 回答