如果我运行这些命令:
dmesg | head -n 10我猜想,一旦dmesg读取了10行代码,操作系统就会向head发回某种信号。这是怎么回事?head告诉内核什么?
这与一个程序死亡不同,因为这是一个正常的,‘干净’的停止。
发布于 2016-01-18 10:56:17
这取决于操作系统缓冲区以及dmesg的第10次和第11次写入之间的时间。
在head写入10行之后,它将终止,如果dmesg继续向管道写入,它将接收SIGPIPE信号。
根据操作系统缓冲区的不同,dmesg通常会在head使用它们之前编写超过10行。
要查看head已经消耗了10多行代码,可以使用:
strace -f sh -c 'dmesg | head -n 10'(看看head进程,依赖于read系统调用的数量。)
要查看写入速度如何影响:
strace -f sh -c "perl -le '$|++;print 1 while 1' | head -n 10"发布于 2016-01-18 10:52:34
head在打印10行后关闭stdin。然后dmesg检测到stdout已关闭并退出。
更准确地说,dmesg将从对stdout的write调用中接收EPIPE错误。
来自dmesg.c源代码:https://github.com/karelzak/util-linux/blob/v2.27.1/sys-utils/dmesg.c#L654-L659
rc = fwrite(p, 1, len, out) != len;
if (rc != 0) {
if (errno != EPIPE)
err(EXIT_FAILURE, _("write failed"));
exit(EXIT_SUCCESS);
}https://unix.stackexchange.com/questions/256029
复制相似问题