LINUX.ORG.RU

sem_timedwait не хочет ждать


0

0

Добрый день!

Подскажите, пожалуйста, почему sem_timedwait сразу же завершается,
хотя я бы в приведенном далее примере ожидал от него трехтысячесекундного ожидания?

/tmp >time ./a.out
110
Connection timed out

real 0m0.002s
user 0m0.000s
sys 0m0.000s
/tmp >cat sem.c
#include <semaphore.h>
#include <errno.h>

main()
{
  sem_t st;
  struct timespec ts;
  ts.tv_sec = 3000;
  ts.tv_nsec = 0;

  sem_init(&st, 0, 0);
  // sem_wait(&st);
  if (sem_timedwait(&st, &ts))
  {
    printf("%d\n", errno);
    perror(0);
  }
}

С другой стороны, если в семафоре живет 1, то он
сразу же возвращает 0.
Просто sem_wait, естественно, ведет себя вполне ожидаемым образом
и при занятом и при свободном семафоре.

/tmp >ldd a.out
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x4002b000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
/tmp >rpm -qf /lib/tls/libpthread.so.0
glibc-2.3.2-11.9

Os &#8212; Redhat 9, ядро 2.4.20, компилятор gcc 3.2.2

Я так понимаю, что sem_timedwait - не вполне стандартная функция, и я бы смирился с ее полным отсутствием, но здесь какое-то уж больно странное поведение. Буду очень признателен за попытку выполнения моего теста на других системах. При сборке нужно указать -lpthread
anonymous

Ну на самом деле sem_timedwait - стандартная функция (см. POSIX).
А с таймаутом всё очень просто: в структуре struct timespec должно лежать _абсолютное_ значение времени (т.е. таймаут исчисляется с системного времени 0, в UNIX это 1 января 1970 г.).
Читайте man sem_timedwait более внимательно.

romanSA
()
Ответ на: комментарий от romanSA

>Читайте man sem_timedwait более внимательно.

Ага, займусь.

Очень большое спасибо.

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