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

发布于 2024-08-01 17:51:49 字数 56 浏览 6 评论 0原文

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

谢谢

How can i catch sigpipe in iphone/objective-c?

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

冷情 2024-08-08 17:51:49

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

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

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

The first answer doesn't work.
Also I'm trying to use solution described in reference of second post:

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

but this code doesn't work too. Anybody know solution of this problem?

不离久伴 2024-08-08 17:51:49

测试 SigPipeHandler 的一个重要事实是:

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

One important fact for testing the SigPipeHandler:

For me it did not work when the debugger was atached. So when running an app directly from XCode the Handler is not called.
Meanwhile, on a device without the debugger attached the handler works as expected.

三岁铭 2024-08-08 17:51:49

使用旧的良好 POSIX 代码:

#include <signal.h>

void SigPipeHandler(int s);

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

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

signal(SIGPIPE, SigPipeHandler);

Use old good POSIX code:

#include <signal.h>

void SigPipeHandler(int s);

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

Init in some place (main.m?) with

signal(SIGPIPE, SigPipeHandler);
心凉 2024-08-08 17:51:49

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

Try setting SO_NOSIGPIPE as documented here:
How to prevent SIGPIPEs (or handle them properly)

等数载,海棠开 2024-08-08 17:51:49

第一个答案效果很好。 但您应该将所有内容都放在 main.mm 文件中。

静态类(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;
}

The first answer works fine. but you should put every thing in the main.mm file.

And in static class(Singleton) , it also works.

#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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文