2013-04-08 2 views
0

iOS에서 채팅 프로그램을 개발 중입니다. 하지만 스레드와 관련된 문제를 해결할 수 없습니다. 첫째, 스레드에서 다중 연결을 처리하는 서버 소켓을 만들었습니다. 내 코드는 다음과 같습니다.THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     [NSThread detachNewThreadSelector:@selector(aMethod:) toTarget:[self class] withObject:nil]; 
    } 

    void doprocessing(int sock) 
    { 
     int n; 

     char *buffer = malloc(256); 

     bzero(buffer,256); 

     n = read(sock,buffer,255); 
     if (n < 0) 
     { 
      perror("ERROR reading from socket"); 
      exit(1); 
     } 

     printf("Here is the message: %s\n",buffer); 

     n = write(sock,"I got your message",18); 

     if (n < 0) 
     { 
     perror("ERROR writing to socket"); 
     exit(1); 
     } 
    } 

    +(void)aMethod:(id)param{ 

    int x; 
    for(x=0;x<50;++x) 
    { 
    int sockfd, newsockfd, portno, clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
    { 
     perror("ERROR opening socket"); 
     exit(1); 
    } 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = 5001; 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 

    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
      sizeof(serv_addr)) < 0) 
    { 
     perror("ERROR on binding"); 
     exit(1); 
    } 

    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 
    while (1) 
    { 
     newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen); 
     if (newsockfd < 0) 
     { 
      perror("ERROR on accept"); 
      exit(1); 
     } 

     int pid = fork(); 
     if (pid < 0) 
     { 
      perror("ERROR on fork"); 
      exit(1); 
     } 
     if (pid == 0) 
     { 

      close(sockfd); 
      doprocessing(newsockfd); 
      exit(0); 
     } 
     else 
     { 
      close(newsockfd); 
     } 
     } 
    } 
} 

알다시피, 해당 스레드의 GUI 요소에 연결할 수 없습니다. 이런 이유로 mainThread 함수를 호출했지만 여전히 GUI 요소에 연결할 수 없습니다. 이 결과가 있습니다 :

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 

포크를 사용하지 않으면 작동합니다. 하지만 내 질문에 어떻게 포크 함수를 사용하여 GUI 요소에 도달 할 수 있습니다?

+0

GCD를 사용하지 않는 이유가 있습니까? – sosborn

+0

iOS 기기에서는 fork() 또는 exec()를 수행 할 수 없습니다 (http://stackoverflow.com/questions/3619252/fork-on-iphone 비교). 또는 jailbroken 장치를위한 것입니까? –

+0

GCD를 사용했지만이 경우 서버 연결이 실패하는 경우가 있습니다. 나는 많은 것을 시도했지만 더 나은 해결책을 찾을 수 없었다. 네, 이것은 jailbroken 장치를위한 것입니다. – HCD

답변

2

을 당신은 애플의 제한으로 실행하는 을 프레임 워크 (당신이 코멘트에 말했듯이,이, 그렇지 않으면 당신은 전혀 포크() 또는 간부 인()를 사용하지 못했습니다., 탈옥 장치입니다)하는 기술 참고 TN2083 "데몬 및 에이전트"에 Obsolete Programming Techniques에 설명되어 있습니다 :

Daemonizing 프레임 워크

많은 맥 OS X는 포크를 호출 만 할 경우 프레임 워크가 안정적으로 작동하지 않음 exec를 호출하지 않습니다. 유일한 예외는 시스템 프레임 워크이고, 심지어 일지라도, POSIX 표준은 fork와 exec 사이에서 을 수행 할 수있는 것에 심각한 제한을가합니다.