我刚开始在Linux上学习Everything是一个FileTM,这让我想知道如果我真的从/ dev / stdout读取会发生什么:
$cat /dev/stdout
^C
$tail /dev/stdout
^C
(^ C是我挂起后杀死程序).
当我尝试使用vim时,我收到了不可想象的消息:“/ dev / stdout”不是文件.喘气!
那么,当我尝试阅读这些“文件”时,为什么会出现挂断或错误消息?
解决方法:
why am I getting hangups
你没有得到cat(1)和tail(1)的“挂断”,它们只是在读取时阻塞. cat(1)等待输入,并在看到完整的行后立即打印:
$cat /dev/stdout
foo
foo
bar
bar
在这里我输入了fooEnterbarEnterCTRL-D.
tail(1)等待输入,只有当它能检测到EOF时才打印它:
$tail /dev/stdout
foo
bar
foo
bar
在这里我再次输入fooEnterbarEnterCTRL-D.
or error messages
Vim是唯一一个给你一个错误的人.它这样做是因为它对/ dev / stdout有runs stat(2),并且它发现它没有设置S_IFREG位.
/ dev / stdout是一个文件,但不是常规文件.事实上,内核中有一些舞蹈可以在文件系统中输入一个条目.在Linux上:
$ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 May 8 19:42 /dev/stdout -> /proc/self/fd/1
在OpenBSD上:
$ls -l /dev/stdout
crw-rw-rw- 1 root wheel 22, 1 May 7 09:05:03 2015 /dev/stdout
在FreeBSD上:
$ls -l /dev/stdout
lrwxr-xr-x 1 root wheel 4 May 8 21:35 /dev/stdout -> fd/1
$ls -l /dev/fd/1
crw-rw-rw- 1 root wheel 0x18 May 8 21:35 /dev/fd/1
标签:linux,stdout,files
来源: https://codeday.me/bug/20190809/1631681.html