为什么open打开我的文件描述符0?

我正在使用管道和分支的程序,需要将写入结束更改为输出文件。 但是当我打开一个文件时,文件描述符是0,通常是stdin,但我认为这是我的一些问题的原因。 这是我的代码

if (outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC) == -1) { // open failed } 

有人能告诉我为什么它是0吗? 或者如何修复它?

这是因为你将它与-1进行比较。

outputfd没有得到open的结果。 它得到-1的检查结果。

您的代码行中的outputfd不是输出文件描述符,而是等于FALSE (0)。 这是因为open返回的文件描述符不是== -1

它应该是:

 outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC); if (outputfd < 0) { // error handling code } 

或者它应该是:

 if ( ( outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC) ) == -1) { // error handling code } 

请注意,这需要3个额外的括号 - 一个右括号和两个左括号。

只是说明了doron的答案 :

  >> outputfd = open(“file”,O_RDWR | O_CREAT | O_TRUNC)== -1) 

让我们简化:首先删除错误并添加额外的标点,使其看起来像一个真正的诡计

  outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC) == -1; 

现在,用占位符替换函数参数

  outputfd = open() == -1; 

添加括号

  outputfd = (open() == -1); 

什么时候是open()-1的结果? 当操作失败时。 因此,我们假设操作没有失败,并用正数替换open

  outputfd = ( == -1); 

没有正数可以等于-1(禁止转换问题)所以相等测试总是假的…而且假,在C中,根据定义,0

  outputfd = 0; 

在C中,关系运算符的优先级高于赋值运算符。