Is it possible that linux file descriptor 0 1 2 not for stdin, stdout and stderr?

Deadly 提交于 2020-05-12 12:07:09

问题


When a program begins, does it take file descriptors 0, 1 and 2 for stdin, stdout and stderr by default?. And will API calls such as open(...), socket(...) not return 0, 1 and 2 since these values are already taken?. Is there any case in which open(...) or socket(...) would return 0, 1 or 2. And 0, 1 and 2 are not related with stdin, stdout, and stderr.


回答1:


At the file descriptor level, stdin is defined to be file descriptor 0, stdout is defined to be file descriptor 1; and stderr is defined to be file descriptor 2. See this.

Even if your program -or the shell- changes (e.g. redirect with dup2(2)) what is file descriptor 0, it always stays stdin (since by definition STDIN_FILENO is 0).

So of course stdin could be a pipe or a socket or a file (not a terminal). You could test with isatty(3) if it is a tty, and/or use fstat(2) to get status information on it.

Syscalls like open(2) or pipe(2) or socket(2) may give e.g. STDIN_FILENO (i.e. 0) if that file descriptor is free (e.g. because it has been close(2)-d before). But when that occurs, it is still stdin by definition.

Of course, in stdio(3), the FILE stream stdin is a bit more complex. Your program could fclose(3), freopen(3), fdopen(3) ...

Probably the kernel sets stdin, stdout, and stderr file descriptors to the console when magically starting /sbin/init as the first process.




回答2:


  1. When a program begins, does it take file descriptor 0 1 2 for stdin, stdout and stderr by default .

    If you launch your program in an interactive shell normally, yes.

    By @EJP:

    Inheriting a socket as FD 0 also happens if the program is started by inetd, or anything else that behaves the same way.

  2. will the API such as open(...), socket(...) not return 0 1 2 since these value are already be taken.

    Yes.

  3. Is there any case that open(...) or socket(...) would return 0 1 2.

    Yes, if you do something like

    close(0);
    close(1);
    close(2);
    open(...); /* this open will return 0 if success */
    


来源:https://stackoverflow.com/questions/22367920/is-it-possible-that-linux-file-descriptor-0-1-2-not-for-stdin-stdout-and-stderr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!