【发布时间】:2016-07-10 07:00:39
【问题描述】:
有人知道在非基于套接字的文件描述符上工作的与 setsockopt() 等效的方法吗?
具体来说,考虑一下这段代码:
int on = 1;
setsockopt(socketfd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(int));
一切都好,花花公子,现在我们可以避免使用 SIGPIPE 并在编写时参考 EPIPE。但这仅适用于使用 accept()、socket() 等打开的套接字文件描述符。
我正在尝试为 pipe() 调用打开的文件描述符获得类似的功能,而 setsockopt() 会立即将其拒绝为非套接字文件描述符。
对于由 pipe() 或 open() 打开的描述符,是否有与上述 (setsockopt()) 等效的方法?
【问题讨论】:
-
如果你想避免
SIGPIPE,你可以分配一个信号处理器。setsockopton 我知道的文件没有等价物。 -
唉,我正在编写一个库,所以我试图避免信号处理,因为我永远无法确定我上面的实现者(使用我的库)将需要什么,明智的信号处理。如果我只是在整个进程范围内终止 SIGPIPE 并且我上面的一些代码没有正确实现(忽略 EPIPE),这可能会成为一个问题。不过感谢您的建议!
-
这个answer 可能是相关的,如果 SIGPIPE 总是被忽略是可以的。
-
不幸的是,由于各种原因,忽略 SIGPIPE 并不是一个真正的选择。另外,如果您在 LLDB 中调试应用程序,则信号处理程序仅在您告诉 LLDB 传递信号而不是停止(可能很麻烦)后才接收信号。
-
将信号处理程序分配给 SIGPIPE 意义不大,而是您需要 忽略它 以便甚至不发送信号(调试器不会妨碍)和系统调用返回 EPIPE。我怀疑任何不是“打算成为管道的一部分”的 Unix 程序(即不是
grep或sed或cat或类似的)真的应该忽略 SIGPIPE,但我理解你不想从图书馆强加这个。