gpt4 book ai didi

c - 尝试将设备管道的内容读入缓冲区会导致错误

转载 作者:行者123 更新时间:2023-11-30 18:01:09 24 4
gpt4 key购买 nike

我的 C/C++ 程序从命令行获取一个文件作为参数。从“常规文件”读取数据没有问题/一般编程任务,但是当文件来自“设备管道”(例如/dev/fd/63)时,它会导致我的程序崩溃。

重现:

从您友好的邻居 bash shell 中向您的应用程序提供一个“设备管道”作为文件。您的应用程序应尝试将文件内容读入缓冲区。

./yourapp <(echo 'Hello World!'); #/dev/fd/xx 包含 echo 命令的输出。

注意上面的命令没有重定向应用程序的标准输入,这不是预期的结果。

我认为很多人都不知道这会让他们的应用程序崩溃。 Gnome 项目中的应用程序“seed”使用 glib 来执行其 I/O,但它可以很好地读取这些文件。命令“cat”也可以优雅地处理这种情况。为什么当我尝试像常规文件一样读取该命名管道的内容时,我的应用程序会出现崩溃错误?

编辑:相关代码部分

#include <stdio.h>

int main(int argc, char **argv) {

FILE *file;

char *buffer;

unsigned long fileLen;

//Open file
file = fopen(argv[1], "rb");
if (!file) return -1;

//Get file length
fseek(file, 0, SEEK_END);
fileLen=ftell(file);

fseek(file, 0, SEEK_SET);

//Allocate memory
buffer=(char *)malloc(fileLen+1);

if (!buffer){
fprintf(stderr, "Memory error!");
fclose(file);
return -2;
}

//Read file contents into buffer
fread(buffer, fileLen, 1, file);
fclose(file);

fprintf(stdout, "Size: %i", fileLen);

free(buffer);

}

最佳答案

无法在管道上调用 fseek。代码表明我确实想做这样一件愚蠢的事情。

关于c - 尝试将设备管道的内容读入缓冲区会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com