c - 意外输入 62;9;c62;9;c62;9;c62;9;c 在将缓冲区写入标准输出后出现在 shell 中

标签 c linux shell buffer stdout

目标是读取文件并将缓冲区直接写入标准输出,以便它可用于进一步处理。这符合文本文件、图像和 pdf 的预期。但是当阅读 pdf 文件时,shell 输入中会显示一个奇怪的输入,即:62;9;c62;9;c62;9;c62;9;c。我在 Ubuntu 14.04.3 LTS (14.04) trusty 上编译了 test.c。

shell

user@user-virtualmachine:~$./test
<prints binary data here
...
...
end of binary data>
user@user-virtualmachine:~$62;9;c62;9;c62;9;c62;9;c

当我检查 md5sum 时,它是一个匹配项,所以没有什么奇怪的:

md5sum paper.pdf
5152a6c5b7deb364385fb3dd27c586db     paper.pdf

./test | md5sum
5152a6c5b7deb364385fb3dd27c586db     -

我试图在网上查找它,它说某些二进制数据可能会导致 shell 在将其写入标准输出时以意外的方式运行。这个问题能解决吗?下面提供了代码。

测试.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    ssize_t bytes_read;
    char buffer[1024];
    int fd;

    fd = open("paper.pdf", O_RDONLY);
    if(fd < 0) {
     perror("Error in reading file");
     exit(1);
    }

    do {
     bytes_read = read(fd, buffer, 1024);
     if(bytes_read > 0) {
         write(fileno(stdout), buffer, bytes_read);
     }
    } while(bytes_read > 0);

    close(fd);

    return 0;
}

最佳答案

PDF 文件是二进制 文件。虽然它们可以包含文本,但它们可以并且确实包含非文本数据。

要解决这个问题:不要将二进制数据转储到 shell 的输出中。二进制数据来自何处并不重要 - 尝试 cat/usr/bin/bash。你会得到相同的结果。防止这种情况“弄乱”您的 shell 输出的唯一方法是不这样做。

关于c - 意外输入 62;9;c62;9;c62;9;c62;9;c 在将缓冲区写入标准输出后出现在 shell 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33190113/

相关文章:

c - 这种悲伤教导的奇怪行为的原因是什么?

c - 使用 getopt 解析命令行参数

printf()中的c函数调用错误

linux - cron执行错误

python - 为什么脚本语言(例如 Perl、Python、Ruby)不适合作为 shell 语言?

c - 避免在 makefile 中重复行

linux - SIGCHLD 是否在 SIGTERM 上发送?

linux - ant Permission Denied 问题

macos - shell :我可以在 mac 中使用类似 linux 的命令样式 `rm tmp/-fr`

javascript - 如何使用 jq 命令行实用程序执行 JSON 对象更新