日期:2014-05-16  浏览次数:20774 次

求解释stdin,stdout,stderr
它们都是指向FILE结构的指针,FILE结构里有文件描述符,默认stdin文件描述符是0,stdout是1,stderr是2。
本以为它们指向不同的文件,后来发现不是的
lrwxrwxrwx 1 root root 15 12-01 14:09 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 12-01 14:09 /dev/stdout -> /proc/self/fd/1
lrwxrwxrwx 1 root root 15 12-01 14:09 /dev/stderr -> /proc/self/fd/2
lrwx------ 1 root root 64 12-11 09:55 /proc/self/fd/0 -> /dev/pts/0
lrwx------ 1 root root 64 12-11 09:56 /proc/self/fd/1 -> /dev/pts/0
lrwx------ 1 root root 64 12-11 09:56 /proc/self/fd/2 -> /dev/pts/0
crw--w---- 1 root tty 136, 0 12-11 09:56 /dev/pts/0


它们都指向同一个字符设备文件,这样的话我们fprintf(stdin,"hello world");不就也可以屏幕输出了吗?
所以我试了试,不可以,不知道为什么?

------解决方案--------------------
/dev/pts/0 是linux虚拟终端的设备节点
虽然他们3都指向/dev/pts/0 
但是/proc/不是一个普通的文件系统,/proc文件系统里的每一个文件的读写都是内核里专门函数实现的专有功能
不能用普通目录的常理推断

我猜测/proc/self/fd/0
/proc/self/fd/1 都是只能写或者只能读,不像普通文件fd那样既能读也能写

同求高人解答
------解决方案--------------------
[root@RHEL6A ~]# echo 'a' > /dev/stdout
a
[root@RHEL6A ~]# echo 'a' > /dev/stdin
a
[root@RHEL6A ~]# echo 'a' > /dev/stderr
a

echo.c里用的好像是putchar?是不是跟各自的实现方式有关?