views:

116

answers:

4

I'm working on a program that is using a pipe and forks and need to change the write end to an output file. But when I open a file the file descriptor is 0 which is usually stdin but which I think is the cause of some of my problems. Here is my code

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

Can someone let me know why it is 0? Or how to fix it?

+1  A: 

It's because you're comparing it to -1.

outputfd doesn't get the result of open. It gets the result of the check for -1.

Nathan Fellman
+5  A: 

outputfd in your line of code is not the output file descriptor but rather is equal to FALSE (0). This is because the file descriptor returned by open is not == -1

It should read:

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

Or it should read:

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

Note that this required 3 extra parentheses - one right parenthesis and two left.

doron
+3  A: 

Just illustrating doron's answer:

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

Let's simplify: first remove errors and add extra punctutation to make it look like an actual stement

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

Now, replace function parameters with a placeholder

   outputfd = open(<PLACEHOLDER>) == -1;

Add parenthesis

   outputfd = (open(<PLACEHOLDER>) == -1);

When is the result of open() -1? When the operation failed. So let's assume the operation didn't fail and replace the open with a positive number

   outputfd = (<POSITIVENUMBER> == -1);

No positive number can ever be equal to -1 (barring conversion problems) so the equality test is always false ... and false, in C is, by definition, 0

   outputfd = 0;
pmg
+2  A: 

In C, relational operators have higher precedence than assignment operators.

Ignacio Vazquez-Abrams