簡體   English   中英

使線程保持活動狀態(pthread,c)

[英]Keep Thread alive (pthread, c)

我有以下情況:

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運行服務器代碼”中的“服務器運行”語句之后(在返回0之前)添加while(1)循環,則服務器將保持活動狀態並繼續讀取消息。 我必須說,我既不是Fortran編程也不是C編程專家。

我剛剛找到了解決方案。 我在Makefile中做了一些更改,發現我真的錯過了-pthread選項。 確實很奇怪,沒有錯誤消息,而且根本就創建了線程。 非常感謝您的所有幫助! 我真的很感激。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM