【发布时间】:2011-10-19 07:24:56
【问题描述】:
在我的 C 程序中,我进行了一个执行“cat”UNIX 命令的系统调用,类似于这样。
sprintf(command, "cat %s", filename);
fprintf(stderr, "Executing command: '%s'\n", command);
system(command);
当我编译和运行程序时,命令没有正确执行。相反,我收到以下错误。
Executing command: 'cat temp.txt'
cat: stdout: Bad file descriptor
我的问题有两个。
- 为什么这段代码不能正常工作,我该如何解决?
- 当我在命令行上尝试
perl -e 'system("cat temp.txt")'之类的操作时,它按预期工作。 Perl 处理文件句柄的方式与 C 处理文件句柄的方式有什么区别?
谢谢!
更新:感谢 cmets,我很快就发现了问题。我在程序的早些时候不小心关闭了 stdout,这就是为什么cat 程序尝试打印到 stdout 时出现错误的原因。所以看起来 C 和 Perl 处理文件句柄的方式没有区别:以下命令生成完全相同的错误。
$ perl -e 'close(STDOUT); system("cat temp.txt")'
cat: stdout: Bad file descriptor
【问题讨论】:
-
用
stdout做了什么?也许它在通话之前已关闭? -
您是否关闭了标准输出?
-
你是如何运行程序的?您可能已经关闭了标准输出(例如,如果您分叉)
-
你是否因为某种原因关闭了
stdout? -
@FooBah:分叉不会关闭标准输出。
标签: c perl unix filehandle file-descriptor