iphone/objective-cでsigpipeをキャッチするにはどうすればよいですか?
ありがとう
SigPipeHandler をテストするための 1 つの重要な事実:
私にとっては、デバッガーがアタッチされているときは機能しませんでした。そのため、XCode から直接アプリを実行する場合、Handler は呼び出されません。一方、デバッガーが接続されていないデバイスでは、ハンドラーは期待どおりに動作します。
古き良き POSIX コードを使用します。
#include <signal.h>
void SigPipeHandler(int s);
void SigPipeHandler(int s)
{
// do your handling
}
ある場所(main.m?)で初期化
signal(SIGPIPE, SigPipeHandler);
最初の答えはうまくいきます。ただし、すべてをファイルに入れる必要があり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;
}
最初の答えはうまくいきません。また、2番目の投稿を参照して説明されているソリューションを使用しようとしています:
int main(int argc, char *argv[ ]) {
struct sigaction mySigAction;
mySigAction.sa_handler = SIG_IGN;
sigemptyset(&mySigAction.sa_mask);
sigaction(SIGPIPE, &mySigAction, NULL);
...
}
しかし、このコードも機能しません。誰でもこの問題の解決策を知っていますか?
ここに記載されているように SO_NOSIGPIPE を設定してみてください: SIGPIPE を防止する方法 (または適切に処理する方法)