19 Şubat 2018 Pazartesi

Linux timerfd_create metodu

Giriş
Bu metod Linux'a mahsus bir çağrı. Bu metod ile select veya poll ile dinlenebilen bir timer yaratılabilir. Şöyle yaparız.
uint64_t expired = 0;
read (timerfd, &expired, sizeof(uint64_t));
timerfd_create metodu
Birinci parametre olarak CLOCK_MONOTONIC, CLOCK_REALTIME gibi seçenekle kullanılabilir. İkinci parametre olarak flag verilir. Eğer Linux sürümü destekliyorsa TFD_CLOEXE yani close-on-exec kullanılabilir.

Örnek
Şöyle yaparız.
int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
Örnek
Şöyle yaparız.
int timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
Örnek
Eğer hata varsa 0'dan küçük bir değer döner. Şöyle yaparız.
if( timerfd < 0 ) {
  printf("Timer fd failed\n");
}
Örnek
Şöyle yaparız.
int epoll_reactor::do_timerfd_create()
{
#if defined(BOOST_ASIO_HAS_TIMERFD)
# if defined(TFD_CLOEXEC)
  int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
# else // defined(TFD_CLOEXEC)
  int fd = -1;
  errno = EINVAL;
# endif // defined(TFD_CLOEXEC)

  if (fd == -1 && errno == EINVAL)
  {
    fd = timerfd_create(CLOCK_MONOTONIC, 0);
    if (fd != -1)
      ::fcntl(fd, F_SETFD, FD_CLOEXEC);
}
timerfd_settime metodu
Interval atamak için şöyle yaparız.
int milliseconds = 50;// 50 ms for example
struct itimerspec timspec;
timspec.it_interval.tv_sec = 0;
timspec.it_interval.tv_nsec = milliseconds * 1000000;
Delay atamak için şöyle yaparız.
timspec.it_value.tv_sec = 1;
timspec.it_value.tv_nsec = 0;
Başlatmak için şöyle yaparız.
int res = timerfd_settime(timerfd, 0, &timspec, 0);

Hiç yorum yok:

Yorum Gönder