fileno(stdin) versus STDIN_FILENO and friends

Peter Dufault dufault at hda.com
Fri Mar 11 20:21:10 UTC 2011


Shouldn't STDOUT_FILENO etc always be valid, regardless of thread?

Consider this code snippet installed in the RTEMS shell as "filenos":
===
static int
filenos_cmd(int argc, char **argv)
{
    int stdin_fileno = fileno(stdin),
        stdout_fileno = fileno(stdout),
        stderr_fileno = fileno(stderr);

    fprintf(stderr,
        "fileno(stdin),  STDIN_FILENO:  %d %d\n"
        "fileno(stdout), STDOUT_FILENO: %d %d\n"
        "fileno(stderr), STDERR_FILENO: %d %d\n",
        stdin_fileno,  STDIN_FILENO,
        stdout_fileno, STDOUT_FILENO,
        stderr_fileno, STDERR_FILENO);

    fprintf(stderr, "- %s\n",
        (stdin_fileno == STDIN_FILENO &&
        stdout_fileno == STDOUT_FILENO &&
        stderr_fileno == STDERR_FILENO) ? "OK" : "BAD");

    return 0;
}
====

Called from the console:

[/] # filenos                                                                                                                                                                                                                             
fileno(stdin),  STDIN_FILENO:  0 0                                                                                                                                                                                                         
fileno(stdout), STDOUT_FILENO: 1 1                                                                                                                                                                                                         
fileno(stderr), STDERR_FILENO: 2 2                                                                                                                                                                                                         
- OK                                                                                                                                                                                                                                         
[/] #                                                                                                                                                                 

Called via telnet:

[/] # filenos
fileno(stdin),  STDIN_FILENO:  7 0
fileno(stdout), STDOUT_FILENO: 8 1
fileno(stderr), STDERR_FILENO: 9 2
- BAD
[/] # 

Shouldn't the macros reference something that changes with the thread context to appropriate file descriptors without forcing reference to <stdio.h>?

Peter
-----------------
Peter Dufault
HD Associates, Inc.      Software and System Engineering





More information about the users mailing list