URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1128
[ Назад ]

Исходное сообщение
"Срабатывание select по таймеру (UNIX)"

Отправлено Cker , 22-Ноя-02 23:02 
С помощью fork() создаются процессы, в каждом из которых используется структура
struct timeval tv;
И далее есть
tv.tv_sec=60;
select(........., &tv);

Создается один процессс, затем через 30 секунд другой.
А срабатывание select по таймеру происходит одновременно в обоих процессах.
????


Содержание

Сообщения в этом обсуждении
"RE: Срабатывание select по таймеру (UNIX)"
Отправлено Soldier , 24-Ноя-02 12:15 
>С помощью fork() создаются процессы, в каждом из которых используется структура
>struct timeval tv;
>И далее есть
>tv.tv_sec=60;
>select(........., &tv);
>
>Создается один процессс, затем через 30 секунд другой.
>А срабатывание select по таймеру происходит одновременно в обоих процессах.
>????

А можно код поподробнее увидеть? Наверняка там что-то напутано.


"RE: Срабатывание select по таймеру (UNIX)"
Отправлено Cker , 24-Ноя-02 22:52 
Вот примерный код:
Основной процесс, создающий дочерние процессы:
switch (fork())
  {
    case 0:
            close(SSocket);
            SomeFunc(CSocket, inet_ntoa(clnt_addr.sin_addr));
            close(CSocket);
            exit(0);
            break;
   case -1:
            break;
   default:
            close(CSocket);
            break;
  }


Вот код Somefunc:
int ServerCopy(int CSocket, char IP[SizeIP])
  {
    ...
    struct timeval &tv;
    ....

    tv.tv_sec=T1;          //T1 - глобальная переменная с значением 60
    tv.tv_usec=0;

    nfds=getdtablesize();
    FD_ZERO(&afds);
    FD_SET(CSocket, &afds);
    
    while(1)
      {
        memcpy(&rfds, &afds, sizeof(rfds));

        rc=select(nfds, &rfds, (fd_set *)0, (fd_set *)0, &tv);
        if (rc<0)
          {
            return 0;
          }

        if (rc==0)    //Timer
          {
            ....
            tv.tv_sec=T2; //T2 - глобальная переменная с значением 30
          }
  }


Примерно вот так....


"RE: Срабатывание select по таймеру (UNIX)"
Отправлено Cker , 24-Ноя-02 23:01 
Только там в объявлении
struct timeval tv;

"RE: Срабатывание select по таймеру (UNIX)"
Отправлено Soldier , 25-Ноя-02 08:31 
>Вот примерный код:
>Основной процесс, создающий дочерние процессы:
>switch (fork())
>  {
>    case 0:
>            
>close(SSocket);
>            
>SomeFunc(CSocket, inet_ntoa(clnt_addr.sin_addr));
>            
>close(CSocket);
>            
>exit(0);
>            
>break;
>   case -1:
>            
>break;
>   default:
>            
>close(CSocket);
>            
>break;
>  }


Из этого фрагмента не очень понятно: вот это дело, которое выше, если в цикле то поподробнее как оно делается. Согласно этому коду, дитенок запускает SomeFunc, а где обещанная задержка в 30 сек? Она ведь должна в паренте выставляться, а не в дите.

Вообщем очередной раз убедился, что в чужих прогах разбираться...

Ниже мой пример. Дети завершаются с разницей в 5 сек.

//--- chldtest.c
#include <unistd.h>
#include <sys/time.h>

void do_child(int no) {
     struct timeval tv;
     tv.tv_sec=8;
     tv.tv_usec=0;
     select(0,(fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
     printf("child %i finished!\n",no);

}

main()   {

    if (fork()==0) {
      do_child(1);
      return 0;
    }

    sleep(5);

    if (fork()==0) {
      do_child(2);
      return 0;
    }

    while (waitpid(-1,0,0)>=0) usleep(100);
    puts("All children finished.Press ENTER");
    getchar();

}


"RE: Срабатывание select по таймеру (UNIX)"
Отправлено Cker , 25-Ноя-02 11:25 
Рассказываю:
Вот тот код в основной программе:
Там бесконечный цикл прослушивания новых соединений.
И тестирую я таким образом:
Сначала подключаюсь с одного компьютера - запускается первый дочерний процесс;
а потом через 30 секунд подключаюсь с второго компьютера - запускается второй дочерний процесс.

Вот - так. И первое срабатывание происходит через 60 сек в обоих процессах.


"RE: Срабатывание select по таймеру (UNIX)"
Отправлено Soldier , 25-Ноя-02 14:34 
>Рассказываю:
>Вот тот код в основной программе:
>Там бесконечный цикл прослушивания новых соединений.
>И тестирую я таким образом:
>Сначала подключаюсь с одного компьютера - запускается первый дочерний процесс;
>а потом через 30 секунд подключаюсь с второго компьютера - запускается второй
>дочерний процесс.
>
>Вот - так. И первое срабатывание происходит через 60 сек в обоих
>процессах.

В тупике я. У меня срабатывает нормально (то бишь с правильным интервалом) по любому - хоть клиент/сервер, хоть автономная программа. Если все еще актуально зашлите мне эту прогу целиком на soldier70@mail.ru - вечерком дома гляну.