Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Is open() on something other than /dev/stderr returning 2 a thing? Or is there something screwy that was causing it to get associated with the open database file?


The kernel gives you the lowest numbered fd available.

If you close stderr, 2 becomes available and can be handed out.

Also it's not exactly guaranteed that 0, 1 and 2 are the fd numbers for stdin, out and err on program start, but they are hard coded and standard.

E: It's implementation defined, ie not guaranteed. Your platform may make guarantees about it, but it is not an actual standard.


> Also it's not exactly guaranteed that 0, 1 and 2 are the fd numbers for stdin, out and err on program start

Yes, it is.

https://pubs.opengroup.org/onlinepubs/9699919799/functions/s...


You’re right, but it’s more than that: stderr is defined to be fd 2. Whatever is assigned to that fd, is the stderr. If you close it and open something else, that something becomes your stderr.


You must differentiate between a guarantee by an actual standard and platform specific documentation.


That is a guarantee by an actual standard. More specifically, it's one of the things that POSIX.1-2017 guarantees but the ISO C standard does not. In practical terms this means that all Unix-like systems use the traditional fd numbers for stdin, stdout and stderr but it's possible that non-Unix systems might not.


(Standard C doesn't have file descriptors at all, it has FILE * file handles).


Can you tell me what the "std" in "IEEE Std 1003.1-2017" stands for?


He linked an actual standard.


http://man7.org/linux/man-pages/man3/stdin.3.html

> On program startup, the integer file descriptors associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively.


> On program startup

Then, after program startup, if it is closed, then fd 2 could be assigned to something else.


You must differentiate between a guarantee by an actual standard and platform specific documentation.


https://pubs.opengroup.org/onlinepubs/9699919799/functions/s...

> The following symbolic values in <unistd.h> define the file descriptors that shall be associated with the C-language stdin, stdout, and stderr when the application is started:

> STDIN_FILENO Standard input value, stdin. Its value is 0.

> STDOUT_FILENO Standard output value, stdout. Its value is 1.

> STDERR_FILENO Standard error value, stderr. Its value is 2.


It is not only guaranteed by the POSIX standard, as pointed out by the siblings, it is necessary for standard shell scripting idioms to work, e.g. "command1 2>&1 | command2".


Of course it is. That's how people did redirection of stderr before threads and before dup2.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: