1

iOSでチャットプログラムを開発しています。しかし、スレッドに関する問題は解決できませんでした。まず、スレッドで複数の接続を処理するサーバー ソケットを作成しました。私のコードはそのようなものです:

    - (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 要素に到達するにはどうすればよいかということです。

4

1 に答える 1

2

(コメントで言ったように、これはジェイルブレイクされたデバイス用です。それ以外の場合は、 fork() または exec() をまったく使用できませんでした。)

テクニカル ノート TN2083「デーモンとエージェント」の廃止されたプログラミング手法に記載されている Apple フレームワークの制限に直面しています。

フレームワークのデーモン化

fork を呼び出しても exec を呼び出さないと、多くの Mac OS X フレームワークが確実に動作しません。唯一の例外はシステム フレームワークであり、そこでも POSIX 標準は fork と exec の間でできることに対して厳しい制約を課しています。

于 2013-04-08T06:04:46.040 に答える