The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Срабатывание select по таймеру (UNIX)"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Срабатывание select по таймеру (UNIX)"
Сообщение от Cker Искать по авторуВ закладки on 24-Ноя-02, 22:52  (MSK)
Вот примерный код:
Основной процесс, создающий дочерние процессы:
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
          }
  }


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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Срабатывание select по таймеру (UNIX)"
Сообщение от Cker Искать по авторуВ закладки on 24-Ноя-02, 23:01  (MSK)
Только там в объявлении
struct timeval tv;
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Срабатывание select по таймеру (UNIX)"
Сообщение от Soldier Искать по авторуВ закладки on 25-Ноя-02, 08:31  (MSK)
>Вот примерный код:
>Основной процесс, создающий дочерние процессы:
>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();

}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру