我目前正在 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”命令相比会产生不同的输出。
感谢您的帮助。
输出中包含附加文件
tee
和 test.txt
是因为:
tee
是编译tee.c时生成的可执行文件。当您使用命令 tee
时,它使用文件 /usr/bin/tee
,因此不会出现。tee
这样的实用程序将在/usr/tmp
中创建文件,然后将它们移动到目的地作为终止前的最终操作。这就是为什么使用命令 tee
时它不会出现。