查看dev下的文件详细

[root@test-master ~]# ll /dev/
···
lrwxrwxrwx 1 root root          15 Dec  7  2018 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root          15 Dec  7  2018 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root          15 Dec  7  2018 stdout -> /proc/self/fd/1
···
  • 发现stdin对应操作符0
  • stdout对应操作符1
  • stderr对应操作符2

查看操作符0详细

[root@test-master ~]# ll /proc/self/fd/0
lrwx------ 1 root root 64 Dec 27 14:59 /proc/self/fd/0 -> /dev/pts/3
  • 发现操作符0软链到/dev/pts/3

/proc/self/目录的意义: 我们可以通过/proc/$pid/来获取指定进程的信息,例如内存映射、CPU绑定信息等等。如果某个进程想要获取本进程的系统信息,就可以通过进程的pid来访问/proc/$pid/目录。但是这个方法还需要获取进程pid,在fork、daemon等情况下pid还可能发生变化。为了更方便的获取本进程的信息,linux提供了/proc/self/目录,这个目录比较独特,不同的进程访问该目录时获得的信息是不同的,内容等价于/proc/本进程pid/。进程可以通过访问/proc/self/目录来获取自己的系统信息,而不用每次都获取pid。同想可通过ls -all /proc/self发现链接到某进程文件夹

查看/dev/pts文件夹下文件详情

[root@test-master ~]# ll /dev/pts
total 0
crw--w---- 1 root tty  136, 0 Dec 27 14:19 0
crw------- 1 root root 136, 1 Dec 27 14:08 1
crw--w---- 1 root tty  136, 3 Dec 27 15:02 3
c--------- 1 root root   5, 2 Dec  7  2018 ptmx
  • 0/1/3分别对应三个窗口连接
  • 当新打开一个窗口连接时,此处会新增一个文件

在一个窗口中向另外一个窗口发送数据

[root@test-master dev]# ll /proc/self/fd/0
lrwx------ 1 root root 64 Dec 27 15:04 /proc/self/fd/0 -> /dev/pts/0
[root@test-master dev]# echo "test" > /dev/pts/3

另一个窗口收到内容

[root@test-master ~]# test

可通过命令tty查看当前的终端号

打开某个文件,查看fd的情况

  • vim打开任一文件
[root@test-master ~]# vi anaconda-ks.cfg
  • 通过ctrl+z将vim置于后台
  • 查看vi进程的进程号
[root@test-master ~]# ps -ef|grep vi
root       374 58881  0 15:46 pts/3    00:00:00 vi anaconda-ks.cfg
  • 查看该进程的操作符
    [root@test-master ~]# ll /proc/374/fd/
    total 0
    lrwx------ 1 root root 64 Dec 27 15:48 0 -> /dev/pts/3
    lrwx------ 1 root root 64 Dec 27 15:48 1 -> /dev/pts/3
    lrwx------ 1 root root 64 Dec 27 15:47 2 -> /dev/pts/3
    lrwx------ 1 root root 64 Dec 27 15:48 4 -> /root/.anaconda-ks.cfg.swp
    
    • 其中0/1/2分别对应 stdin/stdout/stderr
    • 4对应的即为该文件的操作符
  • 恢复vi
[root@test-master temp]# jobs
[1]-  Stopped                 vi anaconda-ks.cfg  (wd: ~)
[2]+  Stopped                 vi ca.crt
[root@test-master temp]# fg 1

如果程序是nohup方式启动的,则会发现stdin为/dev/null

参考