С помощью fork() создаются процессы, в каждом из которых используется структура
struct timeval tv;
И далее есть
tv.tv_sec=60;
select(........., &tv);Создается один процессс, затем через 30 секунд другой.
А срабатывание select по таймеру происходит одновременно в обоих процессах.
????
>С помощью fork() создаются процессы, в каждом из которых используется структура
>struct timeval tv;
>И далее есть
>tv.tv_sec=60;
>select(........., &tv);
>
>Создается один процессс, затем через 30 секунд другой.
>А срабатывание select по таймеру происходит одновременно в обоих процессах.
>????А можно код поподробнее увидеть? Наверняка там что-то напутано.
Вот примерный код:
Основной процесс, создающий дочерние процессы:
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
}
}
Примерно вот так....
Только там в объявлении
struct timeval tv;
>Вот примерный код:
>Основной процесс, создающий дочерние процессы:
>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();}
Рассказываю:
Вот тот код в основной программе:
Там бесконечный цикл прослушивания новых соединений.
И тестирую я таким образом:
Сначала подключаюсь с одного компьютера - запускается первый дочерний процесс;
а потом через 30 секунд подключаюсь с второго компьютера - запускается второй дочерний процесс.Вот - так. И первое срабатывание происходит через 60 сек в обоих процессах.
>Рассказываю:
>Вот тот код в основной программе:
>Там бесконечный цикл прослушивания новых соединений.
>И тестирую я таким образом:
>Сначала подключаюсь с одного компьютера - запускается первый дочерний процесс;
>а потом через 30 секунд подключаюсь с второго компьютера - запускается второй
>дочерний процесс.
>
>Вот - так. И первое срабатывание происходит через 60 сек в обоих
>процессах.В тупике я. У меня срабатывает нормально (то бишь с правильным интервалом) по любому - хоть клиент/сервер, хоть автономная программа. Если все еще актуально зашлите мне эту прогу целиком на soldier70@mail.ru - вечерком дома гляну.