![]() |
1
220
你一般都想忽略
最便携的方法是设置
忽视
如果你在使用
最后,您还可以考虑
|
![]() |
2
145
另一种方法是更改套接字,这样它就不会在write()时生成sigpipe。这在库中更方便,因为您可能不希望使用用于sigpipe的全局信号处理程序。 在大多数基于BSD的(MACOS,FreeBSD…)系统中,(假设你使用C/C++),你可以这样做:
在这种情况下,将返回epipe,而不是生成sigpipe信号。 |
![]() |
3
110
我参加聚会迟到了,但是
一个不错的选择,如果你在,比如说,一个没有
示例替换
|
![]() |
4
28
在这 post 我描述了在既没有sou nosigpipe也没有msg nosignal的情况下,Solaris案例的可能解决方案。
实例代码 https://github.com/kroki/XProbes/blob/1447f3d93b6dbf273919af15e59f35cca58fcc23/src/libxprobes.c#L156 |
![]() |
5
19
就地处理信号管通常最好在本地处理错误,而不是在全局信号事件处理程序中处理错误,因为在本地,您将有更多的上下文来了解正在发生的事情和要采取的措施。 我的一个应用程序中有一个通信层,允许我的应用程序与外部附件通信。当发生写错误时,我在通信层中抛出异常并让它冒泡到一个try-catch块来处理它。 代码:忽略sigpipe信号以便在本地处理的代码是:
此代码将阻止引发sigpipe信号,但在尝试使用套接字时,您将收到一个读/写错误,因此需要检查该错误。 |
![]() |
6
13
您不能阻止管道远端的进程退出,如果在您完成写入之前退出,您将收到一个sigpipe信号。如果您发出信号,那么您的写入将返回一个错误-您需要注意并对该错误作出反应。仅仅捕获和忽略处理程序中的信号并不是一个好主意——您必须注意管道现在已经失效,并修改程序的行为,使其不再写入管道(因为信号将再次生成,并再次忽略,您将重试,整个过程可以继续执行 长的 时间和浪费大量的CPU电源)。 |
![]() |
7
5
我相信这是对的。你想知道另一端什么时候关闭了他们的描述符,这就是sigpipe告诉你的。 山姆 |
![]() |
8
2
Linux手册说:
但对于Ubuntu 12.04来说,这是不对的。我为那个案子写了一个测试,我总是收到没有信号管的EPIPE。如果我第二次尝试写入同一个损坏的套接字,则生成sigpipe。所以,如果发生这个信号,您不需要忽略sigpipe,它意味着程序中的逻辑错误。 |
![]() |
9
2
或者根据每个人禁用信号管道,或者捕获并忽略错误。
是,使用select()。
您需要选择 阅读 位。你可能会忽略 写 位。 当远端关闭其文件句柄时,select将告诉您有准备读取的数据。当你去读它的时候,你会得到0个字节,这就是操作系统告诉你文件句柄已经关闭的方式。 唯一不能忽略写入位的时间是,如果您发送的是大容量的数据,那么另一端可能会有被积压的风险,这会导致缓冲区被填满。如果发生这种情况,那么尝试写入文件句柄可能会导致程序/线程阻塞或失败。在写之前测试select可以保护您不受影响,但它不能保证另一端是健康的,或者您的数据将到达。 请注意,您可以从close()以及在编写时获取sigpipe。 关闭将刷新所有缓冲数据。如果另一端已经关闭,那么关闭将失败,您将收到一个信号管。 如果您使用的是缓冲TCPIP,那么成功的写入只意味着您的数据已经排队发送,而不是意味着它已经发送。在成功调用Close之前,您不知道数据已发送。 Sigpipe告诉你出了什么问题,它没有告诉你该怎么做,或者你应该怎么做。 |
![]() |
10
1
在现代POSIX系统(即Linux)下,您可以使用
如果以后要还原以前的状态,请确保保存
有关更多信息,请阅读 man page . |
![]() |
Arman · django m2m\u已更改不工作 7 年前 |
![]() |
Kev · Python中的信号频率滤波 7 年前 |
![]() |
Giorgi Cercvadze · 如何将暂停的进程设置为后台? 7 年前 |
![]() |
miXo · 如何使用整数除法降低采样率? 7 年前 |