编写器进程退出后,如何从命名管道读取?

斯里达·萨诺巴特(Sridhar Sarnobat)

我想将命名管道用作异步任务队列(可能类似于JMS)。

例如,假设一个客户端发送了一些我想插入到数据库中的数据,但是我希望该客户端立即与服务器断开连接,并且服务器进程将这些数据通过管道传递到一个命名管道中。然后完全独立地从管道读取数据并执行SQL插入,这可能非常慢-但是客户端不会注意到,因为它会立即获得响应。

作为原型,我认为这可以工作(为简单起见,回显“ 45”,而不是通过netcat客户端-服务器对发送):

zsh> nohup echo "45" > my_named_pipe &
zsh> exit
zsh: warning: 1 jobs SIGHUPed

然后,很久以后,执行

zsh> cat my_named_pipe

但是,管道中没有任何东西。我的设置有什么问题?

PS:我从来没有nohup上班。disown在这种情况下,我始终依赖我不想作为单独命令执行的操作。

斯蒂芬·查泽拉斯(Stephane Chazelas)

当您这样做时:

nohup echo "45" > my_named_pipe &

外壳本身分叉。在孩子中,它my_named_pipe可以写字。open()将阻塞,直到别的东西打开my_named_pipe阅读。

当您exit在父进程中运行时,子进程仍在上受阻,open()尚未执行nohup

因此,退出外壳程序后,外壳程序会将SIGHUP发送给子级,该子级不会被忽略,因为它尚未运行nohup

赶紧跑:

(echo 45 > my_named_pipe &)

或搭配zsh

echo 45 > my_named_pipe &!

&! 是zsh的语法糖 disown

BASH和ZSH都有一个很好的内置函数,称为disown。它使用户能够以类似于nohup的方式将过程从外壳中分离出来。ZSH有一个不错的糖:您可以放&!在命令末尾,它将被分离。BASH没有这种糖

http://blog.debiania.in.ua/posts/2013-03-13-fun-with-bash-disown.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从命名管道读取错误

来自分类Dev

从命名管道读取cat命令时,如何停止它?

来自分类Dev

从命名管道读取连续数据

来自分类Dev

从命名管道读取的C不会结束

来自分类Dev

Python从命名管道/ FIFO读取JSON

来自分类Dev

C从命名管道读取和写入

来自分类Dev

从命名管道读取连续数据

来自分类Dev

SIGPIPE如何影响命名管道中的编写器?

来自分类Dev

从命名管道和管道读取到辅助过程

来自分类Dev

如何读取屏幕的命名管道?

来自分类Dev

从命名管道(cat或tail -f)连续读取

来自分类Dev

使用 Java 从命名管道中连续读取

来自分类Dev

退出父进程后无法读取子进程

来自分类Dev

命名管道服务器退出而没有警告

来自分类Dev

管道断开后如何恢复进程GUI

来自分类Dev

当ffmpeg到达命名管道的末尾时,如何阻止ffmpeg退出?

来自分类Dev

使用民意调查无法从命名管道中读取多个单词

来自分类Dev

守护程序不会杀死正在从命名管道中读取的孩子

来自分类Dev

从命名管道读取时,每M字节跳过N个字节

来自分类Dev

如何枚举进程中所有命名管道的名称?

来自分类Dev

阻塞直到读取器已连接到命名管道

来自分类Dev

阻塞直到读取器已连接到命名管道

来自分类Dev

命名管道和后台进程

来自分类Dev

从命名管道中并发选择

来自分类Dev

从命名管道获取标准输入

来自分类Dev

主进程退出后如何保持线程存活?

来自分类Dev

启动Python进程后如何退出bash脚本?

来自分类Dev

子进程未读取管道

来自分类Dev

是否可以通过从命名管道或标准输入中读取数据来制作多卷RAR存档?