Bonjour, ligne 57, j'ai timerfd_settime() qui retourne -1.
L'erreur est: settime error: 22: Invalid argument
Voila le code:
Merci d'avance pour votre aide.
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)); }
Partager