在C语言中模拟Linux命令tee

5

我需要在Linux下用C语言模拟tee命令的操作。那么tee是如何内部工作的呢?它看起来像一个"T"形的管道,所以我应该使用管道吗?是否有一种特殊的管道?


'man tee' 会告诉你有关该命令的所有信息。Tee 允许你将一个程序的标准输出分成文件和标准输出。 - James
@wich 请停止将"homework"标签添加到问题中。参见http://meta.stackexchange.com/questions/147100/trogdor-ate-my-homework-tag - user229044
3个回答

3

tee 命令可以将标准输入的数据流输出到标准输出并保存在指定的文件中,它可以应用于很多不同的情况。

使用 C 语言实现很简单,只需要编写一个程序将标准输入的所有数据复制到标准输出,并基于命令行参数打开文件后使用相同的输出语句将其输出到文件中。

伪代码示例:

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

请注意,您实际上不需要对管道进行任何操作,您的shell会处理管道,程序只需要将数据从一个流复制到另外两个流即可。

好的,我有这个代码:#include <stdio.h>main(int agrc, char **argv[]){ FILE *fp; FILE *fp1; fp = fopen(*argv[1], "r"); fp1 = fopen(*argv[2], "w"); char buffer[100]; while (feof(fp) == 0){
fscanf(fp, "%s", buffer); printf("%s", buffer); fprintf(fp1, buffer); } fclose(fp); fclose(fp1); }我执行了 ./a.out hello.txt hello2.txt但是...出现了“分段错误”。这里错在哪里?顺便说一下,它能够正确编译。 谢谢。
- Ecle Beckett
可能有几个原因。第一,您分配了一个有限大小的缓冲区,如果任何行超过该大小,您将访问缓冲区空间之外的内存。我的建议是不要使用fscanf和printf,而是使用仅读取和写入字节序列的函数。第二个原因是您没有进行任何错误检查,如果fopen失败,它将返回NULL,其他函数将尝试访问该NULL指针。 - wich

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");
}

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接