2013-06-21 3 views
1

У меня следующая ситуация:Keep Thread живого (PTHREAD, с)

программы на Фортран звонки (iso_c_binding) функция (написано в C), который запускает сервер (сокет функцию) с помощью функции pthread_create. Предполагается, что этот сервер продолжит работу (ожидая подключения) до тех пор, пока определенная переменная не будет установлена ​​на 1. Проблема заключается в том, что, как только функция, которая запускает сервер, возвращается (в программу 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; 
    } 
    } 
} 

код с сервера

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; 
} 

Если я добавляю цикл while (1) после оператора «Сервер работает» в «c run server code» (до возврата 0), сервер остается в живых и продолжает читать сообщения. Должен сказать, что я не эксперт ни в программировании Фортрана, ни в программировании на С.

+0

Как вы это называете? Показать код. У меня лично нет проблем с асинхронным вводом-выводом с использованием pthreads из Fortran. –

+0

Попробуйте сделать «while' loop volatile. 'while (* (volatile int *) & stop_serv == 0)' или любой тип 'stop_serv'. –

+1

Hmm .. является FORTRAN 'call', запускающим новый процесс для 'run_server'? –

ответ

0

Я только что нашел решение. Я сделал некоторые изменения в Makefile, и я узнал, что я действительно пропустил опцию -pthread. Это действительно странно, что не было сообщений об ошибках и что поток был создан вообще. Большое вам спасибо за вашу помощь! Я очень ценю это.