bash – 为什么“是|睡10“管道不会失败
在考虑如何在我自己的一个程序中实现某个功能时,我一直想知道bash如何在内部处理以下性质的管道:
yes | sleep 10 这显然什么也没做,但我不明白这不会导致错误.我原以为: >因为睡眠不从stdin读取,连接两个进程的管道将填满并导致yes在尝试写入现在的完整管道时无限期阻塞 我想这是我的一些重大误解.我已经尝试过查看bash源代码,但这已经过去了.
这是运行shell命令yes |时实际发生的情况睡10
首先,shell使用 在此之后,shell使用 >在一个子节点中,shell将管道的写入端连接到标准输出并关闭读取端.然后shell调用 一旦10秒钟结束,运行睡眠的过程退出.此时,管道的读取端在任何过程中都不再打开.当进程尝试写入读取端未在任何进程中打开的管道时,内核会向写入进程发送 此时,shell检测到管道两侧的子进程已退出. pipeline命令返回右侧的状态,即0(睡眠成功退出).
这是对的.
这在一些地方是不正确的.是的,不使用非阻塞IO.它与睡眠并行执行,而不是先执行.没有任何过程连接到管道的读取端,直到睡眠退出.根据时间的不同,yes可能会在睡眠开始执行之前开始写入,甚至可能在睡眠程序的子进程被分叉之前开始写入,但是当管道调用返回时,读取结束时,读取结束时写入结束变得开放. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |