为什么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中,关系运算符的优先级高于赋值运算符。