1

次のような状況があります。

Fortran プログラムはiso_c_binding、関数を介してサーバー (ソケット関数) を起動する関数 (C で記述) を呼び出しpthread_createます。このサーバーは、特定の変数が に設定されるまで実行 (接続を待機) し続けることになっています1。私が抱えている問題は、サーバーを起動する関数が (Fortran プログラムに) 戻るとすぐに、サーバー スレッドが終了することです。状況を処理する方法がわかりません(停止する信号を取得するまでサーバーソケットを実行します)。

敬具

(コード追加)

fortran プログラム

...
FUNCTION run_server(ServerRuns) bind(c,name='run_server')
 use iso_c_binding
 import :: c_int
 integer(kind=c_int) :: run_server
 integer(kind=c_int), value :: ServerRuns
END FUNCTION run_server
...
fserver = run_server(ServerRuns)
...

c サーバーコードを実行する

int run_server(int cservrun){

  int err;
  pthread_t tid[1];
  int i = 0;

  if (cservrun != 0){
   printf("[error] Process already running.\n");
   return -1;
  }else{

    err = pthread_create(&(tid[0]), NULL, (void *)&server, NULL);

    if (err != 0){
      printf("[error] Can't create \"server\" thread");
      return -1;  
    }else{
      printf("Server running\n");
      return 0;
    }
  }
}

Cサーバーコード

int server(void){

 ...
 stop_serv = 0;

 while(stop_serv == 0){
   printf("Server loop\n");
   newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

   if (newsockfd < 0){ 
     printf("[error] on accept");
     return -1; 
   } 

   bzero(buffer,SOB);
   n = read(newsockfd,buffer,SOB-1);
   if (n < 0){ 
     printf("[error] reading from socket");
     return -1;
   }

   printf("Message: _%s_\n",buffer);

   close(newsockfd);

 }

 close(sockfd);
 cservrun = 0; 

 return 0;
 }

"c run server code" の "Server running" ステートメントの後 (リターン 0 の前) に while(1) ループを追加すると、サーバーは動作し続け、メッセージを読み続けます。私は、Fortran プログラミングも C プログラミングも専門家ではないと言わざるを得ません。

4

1 に答える 1

0

私はちょうど解決策を見つけました。Makefile にいくつかの変更を加えたところ、-pthread オプションを本当に見逃していることがわかりました。エラー メッセージが表示されず、スレッドがまったく作成されなかったのは、非常に奇妙です。お世話になりました皆様、誠にありがとうございました!ほんとうにありがとう。

于 2013-06-24T05:57:44.233 に答える