如何在 iOS 上避免 SIGPIPE 信号导致的 crash (Avoiding SIGPIPE signal crash in iOS)
来源:互联网 发布:java 上传大文件 编辑:程序博客网 时间:2024/06/05 18:59
http://www.jianshu.com/p/1957d2b18d2c
ps:翻译自 APPLE 文档,最后会附上连接和原文
当使用 socket 进行网络连接时,如果连接中断,在默认情况下,你的 process 会收到一个 SIGPIPE
信号。如果你没有处理这个信号,app 会直接crash!!!
有两种方法可以解决这个问题,任选其一:
- 在全局范围内忽略这个信号
signal(SIGPIPE, SIG_IGN);
需要注意的是,这个方法是全局通用的,所有的 SIGPIPE
信号都将被忽略
- 在一开始的时候设置 socket 不要发送
SIGPIPE
信号
/// sock 就是设置不发送 `SIGPIPE` 信号的 socket 变量int value = 1;setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));
附上 APPLE 原文(ref1):
Use POSIX sockets efficiently (if at all). If you are using POSIX sockets directly:
- Handle or disable
SIGPIPE
.
When a connection closes, by default, your process receives a
SIGPIPE
signal. If your program does not handle or ignore this signal, your program will quit immediately. You can handle this in one of two ways:
- Ignore the signal globally with the following line of code:
signal(SIGPIPE, SIG_IGN);
- Tell the socket not to send the signal in the first place with the following lines of code (substituting the variable containing your socket in place of sock):
int value = 1;setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));
For maximum compatibility, you should set this flag on each incoming socket immediately after calling accept in addition to setting the flag on the listening socket itself.
下面一段提到使用 GCD 时什么时候设置 SO_NOSIGPIPE 的时机(ref2)
Handling Events with Grand Central Dispatch
GCD allows you to perform operations asynchronously, and provides an event queue mechanism for determining when to read data from the socket. After creating the listening socket, a GCD-based server should:
- Call dispatch_source_create to create a dispatch source for the listening socket, specifying DISPATCH_SOURCE_TYPE_READ as the source type.
- Call dispatch_source_set_event_handler (or dispatch_source_set_event_handler_f and dispatch_set_context) to set a handler that gets called whenever a new connection arrives on the socket.
- When the listen socket handler is called (upon a new connection), it should:
- Call accept. This function fills a new sockaddr structure with information about the connection and returns a new socket for that connection.
If desired, call ntohl(my_sockaddr_obj.sin_addr.s_addr) to determine the client’s IP address. - Call dispatch_source_create to create a dispatch source for the client socket, specifying DISPATCH_SOURCE_TYPE_READ as the source type.
- Call setsockopt to set the SO_NOSIGPIPE flag on the socket.
- Call dispatch_source_set_event_handler (or dispatch_source_set_event_handler_f and dispatch_set_context) to set a handler that gets called whenever the state of the connection changes.
- Call accept. This function fills a new sockaddr structure with information about the connection and returns a new socket for that connection.
- In the client socket handler, call dispatch_async or dispatch_async_f and pass a block that calls read on the socket to grab any new data, then handle that data appropriately. This block can also send responses by calling write on the socket.
ref:
- Avoiding Common Networking Mistakes: https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html
- Using Sockets and Socket Streams: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/UsingSocketsandSocketStreams.html#//apple_ref/doc/uid/CH73-SW1
- Ignore SIGPIPE signal on iOS
原文链接:http://www.jianshu.com/p/1957d2b18d2c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
- 如何在 iOS 上避免 SIGPIPE 信号导致的 crash (Avoiding SIGPIPE signal crash in iOS)
- 如何解决ios SIGPIPE 导致的崩溃
- 如何解决ios SIGPIPE 导致的崩溃
- 如何解决ios SIGPIPE 导致的崩溃
- 如何解决ios SIGPIPE 导致的崩溃
- android和ios sigpipe信号导致程序异常退出的问题
- SIGPIPE信号导致的进程崩溃
- iOS开发socket程序被SIGPIPE信号Terminate的问题
- iOS开发socket程序被SIGPIPE信号Terminate的问题
- iOS 开发中 SIGPIPE信号的分析跟处理
- [iOS编程-XCode Debug忽略SIGPIPE信号
- [iOS编程-XCode Debug忽略SIGPIPE信号
- iOS编程-XCode Debug忽略SIGPIPE信号
- ios 收集crash xcode 调试 捕捉signal信号
- iOS 忽略SIGPIPE的问题
- iOS开发 WKWebViewJavascriptBridge Xcode9上导致crash的解决方法
- IOS上的UIApplicationInvalidInterfaceOrientation crash
- SIGPIPE信号导致进程退出
- Flex布局新旧混合写法详解(兼容微信)
- java并发
- android BroadcastReceiver 使用小结
- 获取当前屏幕的宽高
- WdatePicker 时间插件
- 如何在 iOS 上避免 SIGPIPE 信号导致的 crash (Avoiding SIGPIPE signal crash in iOS)
- Java程序员必须掌握的排序算法Java实现整合二 :选择排序
- C#多线程学习 之 线程池[ThreadPool]
- phpexcel读写excel表格详解
- ActiveMQ 简介
- 算法系列-----剑指offer
- Android之应用内部实现国际化
- Java中单例模式和静态类的区别
- 自定义控件