如何在iPhone应用程序中捕获sigpipe?

时间:2009-08-18 14:58:05

标签: iphone objective-c try-catch sigpipe

我如何在iphone / objective-c中捕捉sigpipe?

感谢

5 个答案:

答案 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;
}