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

bsd, c, linux

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.

Problem

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?

Original source

Related problems