2009-08-18 7 views

답변

3

사용 된 좋은 POSIX 코드 : 어떤 장소에서

#include <signal.h> 

void SigPipeHandler(int s); 

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

초기화 (main.m?)

signal(SIGPIPE, SigPipeHandler); 
+0

작동하지 않거나 올바르게 사용하지 않습니다. 두 번째 스레드에서이 오류가 발생했습니다. – Shay

+0

핸들러를 일찍 설치할 수 있습니까? – Farcaller

1

첫 번째 대답은 작동하지 않습니다. 또한 나는 두 번째 이후의 참조에 설명 된 솔루션을 사용하려고 해요 :

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

을하지만,이 코드도 작동하지 않습니다. 이 문제의 해결책을 아는 사람이 있습니까?

1

첫 번째 대답은 정상적으로 작동합니다. 하지만 모든 것을 main.mm 파일에 넣어야합니다.

그리고 static class(Singleton)에서도 작동합니다. SigPipeHandler을 테스트

#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; 
} 
4

한 가지 중요한 사실 : 디버거가 atached 때

나를 위해 작동하지 않았다. 따라서 Xcode에서 직접 응용 프로그램을 실행할 때 Handler가 호출되지 않습니다. 한편 디버거가 연결되지 않은 장치에서는 처리기가 예상대로 작동합니다.

+0

이 답변을 게시 해 주셔서 감사합니다. 디버깅 할 때 제대로 처리되지 않는 신호와 동일한 동작을 관찰했지만 디버깅하지 않을 때는 잘 처리됩니다 ... 이상! 어쨌든, 이것은 궁극적으로 내 애플 리케이션이 사실 SIGPIPE를 처리하고 있다는 것을 깨닫는 데 도움이되었지만 실제로 문제는 처리 된 후에 예외가 발생했지만'@ try''@ catch '를 사용하는 목적 코드에서 잡히지 않았습니다. C 'try'catch 블록이 아닙니다. – Sam

+0

내 sigpipe 처리기가 iOS 시뮬레이터에서 호출되지 않은 것 같습니다. 어쩌면 그것은 내가 xCode에 연결되어 디버깅되었지만 시뮬레이터일지도 모른다고 생각했습니다. –

관련 문제