我有一个小型服务器程序,它接受TCP或本地UNIX套接字上的连接,读取一个简单的命令,并根据命令发送一个回复.问题是客户端有时可能对答案没兴趣并且提前退出,因此写入该套接字将导致SIGPIPE并使我的服务器崩溃.什么是防止崩溃的最佳做法?有没有办法检查线的另一边是否还在读?(select()似乎在这里不起作用,因为它总是说套接字是可写的).或者我应该用处理程序捕获SIGPIPE并忽略它?
根据我的理解,SIGPIPE只能作为a的结果发生write(),它可以(并且确实)返回-1并设置errno为EPIPE......那么为什么我们有额外的信号开销?我每次使用管道时都会忽略SIGPIPE并且从未感到任何痛苦,我是否遗漏了什么?
当我浏览帖子时,我在这里遇到了下面的这个例子,它说proc1.stdout.close()需要被调用以适当退出proc1,生成SIGPIPE.
import subprocess
proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out, err = proc2.communicate()
print('out: {0}'.format(out))
print('err: {0}'.format(err))
Run Code Online (Sandbox Code Playgroud)
但是,我并不清楚。请修正我的理解。
SIGPIPE当 aPIPE尝试写入 closed时发生PIPE。PIPE是proc1的stdout和读者PIPE是proc2的stdin。proc1退出时将退出proc2并proc1尝试将数据写入proc2's stdin PIPE。因为
proc2的stdin PIPE是,当关闭 …我将如何在 python 中执行以下子进程命令?
$ ps aux|grep python
>>> subprocess.check_output(['ps', 'aux', 'grep', 'python']) ?
Run Code Online (Sandbox Code Playgroud) python ×2
sigpipe ×2
subprocess ×2
broken-pipe ×1
c ×1
io ×1
linux ×1
pipe ×1
posix ×1
signals ×1