【问题标题】:Filehandle issue with system call in CC中系统调用的文件句柄问题
【发布时间】: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

我的问题有两个。

  1. 为什么这段代码不能正常工作,我该如何解决?
  2. 当我在命令行上尝试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


【解决方案1】:

似乎您的默认stdout 文件描述符不存在。 stdout 已关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 2011-03-15
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多