我如何在 iphone/objective-c 中捕获 sigpipe?
谢谢
测试 SigPipeHandler 的一个重要事实:
对我来说,连接调试器时它不起作用。因此,当直接从 XCode 运行应用程序时,不会调用 Handler。同时,在没有附加调试器的设备上,处理程序按预期工作。
使用旧的良好 POSIX 代码:
#include <signal.h>
void SigPipeHandler(int s);
void SigPipeHandler(int s)
{
// do your handling
}
在某个地方(main.m?)初始化
signal(SIGPIPE, SigPipeHandler);
尝试按照此处记录的方式设置 SO_NOSIGPIPE: 如何防止 SIGPIPE(或正确处理它们)
第一个答案不起作用。此外,我正在尝试使用第二篇文章参考中描述的解决方案:
int main(int argc, char *argv[ ]) {
struct sigaction mySigAction;
mySigAction.sa_handler = SIG_IGN;
sigemptyset(&mySigAction.sa_mask);
sigaction(SIGPIPE, &mySigAction, NULL);
...
}
但这段代码也不起作用。有人知道这个问题的解决方案吗?
第一个答案工作正常。但是您应该将所有内容都放入main.mm
文件中。
在 中static class(Singleton)
,它也有效。
#import <UIKit/UIKit.h>
#import <sys/signal.h>
#if TARGET_IPHONE_SIMULATOR
#endif
void SigPipeHandler(int s)
{
NSLog(@"We Got a Pipe Single :%d____________",s);
}
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
signal(SIGPIPE, SigPipeHandler);
int retVal = UIApplicationMain(argc, argv, nil, @"FullAppDelegate");
[pool release];
return retVal;
}