timerfd_settime error: 22: Invalid argument
Bonjour, ligne 57, j'ai timerfd_settime() qui retourne -1.
L'erreur est: settime error: 22: Invalid argument
Voila le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #include "EpollTimer.h"
#include "Epoll.h"
#include <iostream>
#include <sys/timerfd.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
char buff_temp[sizeof(uint64_t)];
EpollTimer::EpollTimer()
{
tfd=-1;
singleShot=false;
}
BaseClassSwitch::Type EpollTimer::getType() const
{
return BaseClassSwitch::Type::Timer;
}
bool EpollTimer::start(const unsigned int &msec)
{
if(tfd!=-1)
return false;
if((tfd=::timerfd_create(CLOCK_REALTIME,0)) < 0)
{
std::cerr << "Timer creation error" << std::endl;
return false;
}
timespec now;
if (clock_gettime(CLOCK_REALTIME, &now) == -1)
{
std::cerr << "clock_gettime error" << std::endl;
return false;
}
itimerspec new_value;
if(singleShot)
{
new_value.it_value.tv_sec = now.tv_sec + msec/1000;
new_value.it_value.tv_nsec = now.tv_nsec + (msec%1000)*1000000;
new_value.it_interval.tv_sec = 0;
new_value.it_interval.tv_nsec = 0;
}
else
{
new_value.it_value.tv_sec = now.tv_sec + msec/1000;
new_value.it_value.tv_nsec = now.tv_nsec + (msec%1000)*1000000;
new_value.it_interval.tv_sec = msec/1000;
new_value.it_interval.tv_nsec = (msec%1000)*1000000;
}
if(::timerfd_settime(tfd, TFD_TIMER_ABSTIME, &new_value, NULL)<0)
{
//settime error: 22: Invalid argument
std::cerr << "settime error: " << errno << ": " << strerror(errno) << std::endl;
return false;
}
epoll_event event;
event.data.ptr = this;
event.events = EPOLLIN;
if(Epoll::epoll.ctl(EPOLL_CTL_ADD,tfd,&event) < 0)
{
std::cerr << "epoll_ctl error" << std::endl;
return false;
}
return true;
}
bool EpollTimer::start()
{
return start(msec);
}
void EpollTimer::setInterval(const unsigned int &msec)
{
this->msec=msec;
}
void EpollTimer::setSingleShot(const bool &singleShot)
{
this->singleShot=singleShot;
}
void EpollTimer::exec()
{
::read(tfd, buff_temp, sizeof(uint64_t));
} |
Merci d'avance pour votre aide.