LINUX.ORG.RU

не работает select ()


0

0

Пожалуйста, посмотрите, что здесь может быть неправильно...
Без селекта из двух пайпов данные читаются... с селектом - ни в какую...


//----------------------
//процесс-ребенок
if(fork()==0)
{
dup2(pipe1[1], STDOUT_FILENO);
//endless while
while(1)
{
printf()...
........что-то выводим...
}
}
//----------------------





//descriptors_set
fd_set rdset;
timeval tv = { 0, 1 }; //0.1 sec

while(1)
{
//set to rdset both pipes reading ends
FD_ZERO(&rdset);
FD_SET(pipe1[0],&rdset);
FD_SET(pipe2[0],&rdset);

//waiting for one of descriptors read readiness
res = select(2, &rdset, NULL, NULL, &tv);
if(res<=0)
{
printf("data was not received\n");
}


if(res>0)
{
printf("select returned the result\n");

if(FD_ISSET(pipe1[0], &rdset))
{
bzero(buff, 2000);
read(pipe1[0], buff, 2000);
}

if(FD_ISSET(pipe2[0], &rdset))
{
read(pipe2[0], command_buf, 100);
}
}
}//end of while

anonymous

> res = select(2, &rdset, NULL, NULL, &tv);

man select
---cut---
select() and pselect() examine the I/O descriptor sets whose addresses are passed in readfds, writefds, and exceptfds to see if some of their descriptors are ready for reading, are ready for writing, or have an exceptional condition pending, respectively. The first nfds descriptors are checked in each set; i.e., the descriptors from 0 through nfds-1 in the descriptor sets are examined.
---cut---

// wbr

klalafuda ★☆☆
()

> timeval tv = { 0, 1 }; //0.1 sec

/*
 * Structure returned by gettimeofday(2) system call,
 * and used in other calls.
 */
struct timeval {
        long    tv_sec;         /* seconds */
        long    tv_usec;        /* and microseconds */
};

-> это отнюдь не "0.1 sec" -> на разных системах это может или округлиться до поддерживаемого значения, или tv_usec просто отбрасывается i.e. как если бы было значение 0:0 (нулевой таймаут).

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

> ну так я же делаю FD_SET

http://www.opengroup.org/onlinepubs/009695399/functions/select.html

---cut---
The nfds argument specifies the range of descriptors to be tested. The first nfds descriptors shall be checked in each set; that is, the descriptors from zero through nfds-1 in the descriptor sets shall be examined.
---cut---

ключевое слово - *range* of descriptors.

int fd1, fd2, fd3;
....
fd_set rfds;
int nfds = 0;
FD_ZERO(&rfds);
FD_SET(fd1, &rfds);
if (nfds < fd1) nfds = fd1;
FD_SET(fd2, &rfds);
if (nfds < fd2) nfds = fd2;
FD_SET(fd3, &rfds);
if (nfds < fd3) nfds = fd3;
nfds = select(nfds + 1, &rfds, 0, 0, 0);
....

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

> Вместо времени ставлю NULL - результат тот же, только ждет бесконечно...

естественно бо для значения NULL сказано, что таймаут игнорируется == aka бесконечный таймаут. а вот для != NULL но с очень маленьким значением - тут уже как получится..

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.