3

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

谢谢

4

5 回答 5

4

测试 SigPipeHandler 的一个重要事实:

对我来说,连接调试器时它不起作用。因此,当直接从 XCode 运行应用程序时,不会调用 Handler。同时,在没有附加调试器的设备上,处理程序按预期工作。

于 2011-10-04T11:52:57.840 回答
3

使用旧的良好 POSIX 代码:

#include <signal.h>

void SigPipeHandler(int s);

void SigPipeHandler(int s)
{
    // do your handling
}

在某个地方(main.m?)初始化

signal(SIGPIPE, SigPipeHandler);
于 2009-08-18T18:24:14.203 回答
1

尝试按照此处记录的方式设置 SO_NOSIGPIPE: 如何防止 SIGPIPE(或正确处理它们)

于 2009-12-12T23:06:05.387 回答
1

第一个答案不起作用。此外,我正在尝试使用第二篇文章参考中描述的解决方案:

int main(int argc, char *argv[ ]) {
   struct sigaction mySigAction;
   mySigAction.sa_handler = SIG_IGN;
   sigemptyset(&mySigAction.sa_mask);
   sigaction(SIGPIPE, &mySigAction, NULL);
   ...
}

但这段代码也不起作用。有人知道这个问题的解决方案吗?

于 2010-02-27T15:02:41.373 回答
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;
}
于 2011-09-16T22:31:17.517 回答