保持线程活着(pthread,c)

时间:2013-06-21 07:56:36

标签: c multithreading pthreads fortran fortran-iso-c-binding

我有以下情况:

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)
...

运行服务器代码

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编程的专家。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决方案。我在Makefile中做了一些更改,我发现我真的错过了-pthread选项。真的很奇怪,没有错误消息,并且根本没有创建线程。非常感谢您的帮助!我真的很感激。