次のような状況があります。
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 プログラミングも専門家ではないと言わざるを得ません。