首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“dmesg \ head`”中,dmesg在输出10行后如何被杀死?

在“dmesg \ head`”中,dmesg在输出10行后如何被杀死?
EN

Unix & Linux用户
提问于 2016-01-18 10:34:45
回答 2查看 2.4K关注 0票数 15

如果我运行这些命令:

代码语言:javascript
复制
dmesg | head -n 10

我猜想,一旦dmesg读取了10行代码,操作系统就会向head发回某种信号。这是怎么回事?head告诉内核什么?

这与一个程序死亡不同,因为这是一个正常的,‘干净’的停止。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2016-01-18 10:56:17

这取决于操作系统缓冲区以及dmesg的第10次和第11次写入之间的时间。

head写入10行之后,它将终止,如果dmesg继续向管道写入,它将接收SIGPIPE信号

根据操作系统缓冲区的不同,dmesg通常会在head使用它们之前编写超过10行。

要查看head已经消耗了10多行代码,可以使用:

代码语言:javascript
复制
strace -f sh -c 'dmesg | head -n 10'

(看看head进程,依赖于read系统调用的数量。)

要查看写入速度如何影响:

代码语言:javascript
复制
strace -f sh -c "perl -le '$|++;print 1 while 1' | head -n 10"
票数 28
EN

Unix & Linux用户

发布于 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

代码语言:javascript
复制
rc = fwrite(p, 1, len, out) != len;
if (rc != 0) {
    if (errno != EPIPE)
        err(EXIT_FAILURE, _("write failed"));
    exit(EXIT_SUCCESS);
}
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/256029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档