Search code examples
clinuxbsd

Is it possible that `fileno(stdout) != 1` on a POSIX system?


Can stdout file descriptor differ from 1 (STDOUT_FILENO) assuming stdout need not be a modifiable lvalue?

For example, can freopen("/dev/null", "w", stdout) change fileno(stdout) result?


Solution

  • Yes.

    Test program:

    #include <stdio.h>
    
    int main() {
        fclose(stdin);
        freopen("stdout.txt", "w+", stdout);
        fprintf(stderr, "%d\n", fileno(stdout));
        return 0;
    }
    

    This prints 0 on my machine (OS X 10.9.4).

    File descriptors are typically reused starting from the lowest number first. By closing stdin, file descriptor 0 is freed up, and the subsequent freopen will use file descriptor 0 when opening the file.