如果我知道我的程序输入将来自具有(非标准)ID的文件描述符,我该如何阅读?
例如,如果我需要从ID为3的文件描述符中读取,我该怎么办?
另外,有没有一种简单的方法可以在BASH中测试它,而无需创建另一个程序和管道?
这是我到目前为止所得到的:
char buffer[100];
FILE* fd = fdopen(3, "r");
fgets(buffer, sizeof buffer, fd);
sscanf(buffer, "%d", &whatever);
它会编译但在运行时会出现分段错误。我在gdb中查看了它并且卡在fgets中,所以我猜我做错了什么?可能导致在我测试时文件描述符3上没有文件结尾(再次,如果我能在BASH中正确测试它会很好)。
答案 0 :(得分:2)
如果之前没有打开它,那么 没有带文件描述符3的文件。fdopen()
失败,因此fd
为NULL
,导致在其上尝试fgets()
时出现分段错误。
始终检查函数调用的返回值。
答案 1 :(得分:2)
在bash中,假设您的可执行文件是“a.out”,请执行
./a.out 3< testfile
将testfile分配给文件描述符3
同样的调用适用于bash,sh,zsh,...
它在csh,tcsh,...中不起作用。