我观察到,在 Ubuntu 24.04.2coreutils
版本上9.4-3ubuntu6
运行:
$ tail -c 4097 /dev/zero
$ echo $?
0
立即退出,状态码为 0。我预计该命令将无限期阻塞,因为 /dev/zero 是一个无休止的流。
相反,以下命令的行为符合预期(即,它们会阻塞直到被中断):
$ tail -c 4096 /dev/zero
^C
$ echo $?
130
$ cat /dev/zero | tail -c 4097
^C
$ echo $?
130
调试尝试
strace 输出显示了两次调用之间的差异:
strace tail -c 4096 /dev/zero | strace tail -c 4097 /dev/zero |
---|---|
… | … |
关闭(3)= 0 | 关闭(3)= 0 |
openat(AT_FDCWD, “/dev/zero”, O_RDONLY) = 3 | openat(AT_FDCWD, “/dev/zero”, O_RDONLY) = 3 |
fstat(3,{st_mode=S_IFCHR|0666,st_rdev=makedev(0x1, 0x5),…}) = 0 | fstat(3,{st_mode=S_IFCHR|0666,st_rdev=makedev(0x1, 0x5),…}) = 0 |
lseek(3,-4096,SEEK_END) = 0 | lseek(3,-4097,SEEK_END) = 0 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | 读取(3,“\0\0\0\0\0\0\0\0\0\0\…,4097)= 4097 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | fstat(1,{st_mode=S_IFIFO|0600,st_size=0,…}) = 0 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | 写入(1,“\0\0\0\0\0\0\0\0\0\0\…,4096 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | 关闭(3)= 0 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | 写入(1,“\0”,1)= 1 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | 关闭(1)= 0 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | 关闭(2)= 0 |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | 退出组(0)=? |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | ~~+~~ 以 0 退出 ~~+~~ |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | |
读取(3,“\0\0\0\0\0\0\0\0\0\00”…,8192)= 8192 | |
… |