Bonjour, ligne 57, j'ai timerfd_settime() qui retourne -1.
L'erreur est: settime error: 22: Invalid argument

Voila le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.