【问题标题】:How to catch sigpipe in iphone app?如何在 iphone 应用程序中捕获 sigpipe?
【发布时间】:2009-08-18 14:58:05
【问题描述】:

如何在 iphone/objective-c 中捕捉信号管?

谢谢

【问题讨论】:

    标签: iphone objective-c try-catch sigpipe


    【解决方案1】:

    测试 SigPipeHandler 的一个重要事实:

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

    【讨论】:

    • 非常感谢您发布此答案!我观察到信号在调试时没有正确处理但在不调试时处理良好的相同行为......奇怪!无论如何,这最终帮助我意识到我的应用程序实际上是在处理 SIGPIPE,但我真正的问题是,在它被处理之后,一个 std:exception 被抛出,但后来在我使用 @try @catch 而不是的目标 c 代码中没有被捕获C try catch 块。
    • iOS 模拟器似乎也没有调用我的 sigpipe 处理程序。也许只是我在xCode中附加和调试,但我认为它可能只是模拟器。
    【解决方案2】:

    使用旧的良好 POSIX 代码:

    #include <signal.h>
    
    void SigPipeHandler(int s);
    
    void SigPipeHandler(int s)
    {
        // do your handling
    }
    

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

    signal(SIGPIPE, SigPipeHandler);
    

    【讨论】:

    • 它不起作用或者我没有正确使用它。我的第二个线程出现了这个错误。
    • 你确定,你安装处理程序足够早吗?
    【解决方案3】:

    尝试按照此处记录的方式设置 SO_NOSIGPIPE: How to prevent SIGPIPEs (or handle them properly)

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        第一个答案很好。但你应该把所有东西都放在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;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-15
          • 1970-01-01
          相关资源
          最近更新 更多