У меня следующая ситуация: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), сервер остается в живых и продолжает читать сообщения. Должен сказать, что я не эксперт ни в программировании Фортрана, ни в программировании на С.
Как вы это называете? Показать код. У меня лично нет проблем с асинхронным вводом-выводом с использованием pthreads из Fortran. –
Попробуйте сделать «while' loop volatile. 'while (* (volatile int *) & stop_serv == 0)' или любой тип 'stop_serv'. –
Hmm .. является FORTRAN 'call', запускающим новый процесс для 'run_server'? –