tee命令和tee.c的区别

问题描述 投票:0回答:1

我目前正在 Ubuntu 20.04 Linux 上使用 C 实现“tee”命令。但是,我注意到输出略有不同。

我首先使用

测试 tee 命令
ls -l | tee test.txt

这是输出。

注意:这些文件来自 Linux 编程接口的在线源代码:https://man7.org/tlpi/code/online/all_files_by_chapter.html

现在,我想使用此存储库中的代码来实现“tee”命令:https://github.com/rmacarenhas/lpi/blob/master/chap04/tee.c

#define _XOPEN_SOURCE /* getopt function */
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

#ifndef BUF_SIZ
#define BUF_SIZ 1024
#endif

#ifndef MAX_OUT_FILES
#define MAX_OUT_FILES 128
#endif

typedef enum { FALSE, TRUE } Bool;
void helpAndLeave(const char *progname, int status);
void failure(const char *fCall);
int
main(int argc, char *argv[]) {
  int opt;
  Bool append = FALSE;
  int fd, flags;
  int fds[MAX_OUT_FILES];
  mode_t mode;
  char buf[BUF_SIZ + 1];
  ssize_t numRead;
  int i, numFiles = 0;
  /* Command line arguments parsing */
  opterr = 0;
  while ((opt = getopt(argc, argv, "+a")) != -1) {
    switch(opt) {
      case '?': helpAndLeave(argv[0], EXIT_FAILURE); break;
      case 'h': helpAndLeave(argv[0], EXIT_SUCCESS); break;
      case 'a': append = TRUE;                       break;
    }
  }
  if (optind >= argc) {
    helpAndLeave(argv[0], EXIT_FAILURE);
  }
  /* stdin redirection */
  flags = O_CREAT | O_WRONLY;
  mode = S_IRUSR | S_IWUSR; /* rw------- */
  if (append) {
    flags |= O_APPEND;
  } else {
    flags |= O_TRUNC;
  }
  for (i = optind; i < argc; ++i) {
    fds[i - optind] = fd = open(argv[i], flags, mode);
    if (fd == -1) {
      failure("open");
    }
    ++numFiles;
  }
  while ((numRead = read(STDIN_FILENO, buf, BUF_SIZ)) > 0) {
    if (write(STDOUT_FILENO, buf, numRead) != numRead) {
      failure("write");
    }
    for (i = 0; i < numFiles; ++i) {
      if (write(fds[i], buf, numRead) != numRead) {
        failure("write");
      }
    }
  }
  if (numRead == -1) {
    failure("read");
  }
  for (i = 0; i < numFiles; ++i) {
    if (close(fds[i]) == -1) {
      failure("close");
    }
  }
  return 0;
}
void
helpAndLeave(const char *progname, int status) {
  fprintf(stderr, "Usage: %s [-a] <file1> <file2> ... <fileN>\n", progname);
  exit(status);
}
void
failure(const char *fCall) {
  perror(fCall);
  exit(EXIT_FAILURE);
}

编译完程序后,我用自己的tee程序来实现

ls -l | ./tee test.txt

这是输出:

结果不同。 “test.txt”文件已创建并打印到终端,大小为 0 字节。我还参考了其他存储库并对“tee.c”程序进行了修改,但结果保持不变 -“test” .txt' 也出现在终端中。

因此,我想询问为什么“tee.c”程序与“tee”命令相比会产生不同的输出。

感谢您的帮助。

c linux system
1个回答
0
投票

输出中包含附加文件

tee
test.txt
是因为:

  1. tee
    是编译tee.c时生成的可执行文件。当您使用命令
    tee
    时,它使用文件
    /usr/bin/tee
    ,因此不会出现。
  2. 通常,像
    tee
    这样的实用程序将在
    /usr/tmp
    中创建文件,然后将它们移动到目的地作为终止前的最终操作。这就是为什么使用命令
    tee
    时它不会出现。
© www.soinside.com 2019 - 2024. All rights reserved.