我如何在iphone / objective-c中捕捉sigpipe?
感谢
答案 0 :(得分:4)
测试SigPipeHandler的一个重要事实:
对我来说,在调试器被调用时它不起作用。因此,当直接从XCode运行应用程序时,不会调用Handler。 同时,在没有附加调试器的设备上,处理程序按预期工作。
答案 1 :(得分:3)
使用旧的好POSIX代码:
#include <signal.h>
void SigPipeHandler(int s);
void SigPipeHandler(int s)
{
// do your handling
}
使用
在某个地方(main.m?)初始化signal(SIGPIPE, SigPipeHandler);
答案 2 :(得分:1)
尝试设置SO_NOSIGPIPE,如下所示: How to prevent SIGPIPEs (or handle them properly)
答案 3 :(得分:1)
第一个答案不起作用。 此外,我正在尝试使用第二篇文章中引用的解决方案:
int main(int argc, char *argv[ ]) {
struct sigaction mySigAction;
mySigAction.sa_handler = SIG_IGN;
sigemptyset(&mySigAction.sa_mask);
sigaction(SIGPIPE, &mySigAction, NULL);
...
}
但是这段代码也不行。有人知道这个问题的解决方案吗?
答案 4 :(得分:1)
第一个答案很好。但是你应该将所有内容放在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;
}