【发布时间】:2009-08-18 14:58:05
【问题描述】:
如何在 iphone/objective-c 中捕捉信号管?
谢谢
【问题讨论】:
标签: iphone objective-c try-catch sigpipe
如何在 iphone/objective-c 中捕捉信号管?
谢谢
【问题讨论】:
标签: iphone objective-c try-catch sigpipe
测试 SigPipeHandler 的一个重要事实:
对我来说,连接调试器时它不起作用。因此,当直接从 XCode 运行应用程序时,不会调用 Handler。 同时,在没有附加调试器的设备上,处理程序按预期工作。
【讨论】:
@try @catch 而不是的目标 c 代码中没有被捕获C try catch 块。
使用旧的良好 POSIX 代码:
#include <signal.h>
void SigPipeHandler(int s);
void SigPipeHandler(int s)
{
// do your handling
}
在某个地方(main.m?)初始化
signal(SIGPIPE, SigPipeHandler);
【讨论】:
尝试按照此处记录的方式设置 SO_NOSIGPIPE: How to prevent SIGPIPEs (or handle them properly)
【讨论】:
第一个答案不起作用。 另外我正在尝试使用第二篇文章参考中描述的解决方案:
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;
}
【讨论】: