我想了解三个流的行为 - stdout
,stdin
和stderr
。我无法从任何教科书中得到答案,所以我来到了这里。stdin,stdout和stderr在?之间共享?
我知道这三个存储在文件描述符表中,文件描述符为0(标准输入),1(标准输出)和2(标准错误)。我也知道这些不仅仅是文件描述符,而是可以被重定向的I/O流。好的,那么分享怎么样?
考虑三种情况:
- 当叉子()被调用:子进程和父进程共享文件描述符,但它们具有相同的标准输入,输出和错误?
- 当一个线程被创建时:线程共享文件描述符,但I/O流?
- 当execl()被调用时:在这种情况下,当前过程映像被新的过程映像覆盖。如果我这样做
execl("./a.out", "a.out", NULL);
,那么这个新的可执行文件会得到stdin,stderr和stdout的全新拷贝吗?
明智的答案是值得欢迎的。
谢谢你的精心答复。我发现它有点难以接受。据我了解,对于情况2和3,stdin,stdout和stderr是共享的。我无法理解fork()的情况。 你在说如果一个文件被父进程打开,并且被子进程再次打开;这两个文件描述符是独立的? – 0aslam0 2014-11-02 06:31:32
也请在这里检查。 http://stackoverflow.com/questions/26696811/making-stdin-writable-in-a-safe-and-portable-way – 0aslam0 2014-11-02 07:45:14
是的,在情况2个3的标准流被共享,线程总是共享进程和EXECL ()不会更改进程(它只会更改进程运行的内容)。在fork()的情况下,继承的流仍然可用于子进程。在这种情况下,数据从父进程和子进程都流向哪个进程接收数据。 – 2014-11-04 20:51:10