मैंने TomTom GPS watches over Bluetooth से बात करने के लिए एक उपयोगिता लिखी है, और इसे रन-एंड-भूल पृष्ठभूमि डिमन के रूप में अच्छी तरह से चलाने की कोशिश कर रहा हूं।रीयल-टाइम जागरूक नींद() कॉल?
कार्यक्रम समय-समय पर जीपीएस डिवाइस के साथ संचार करता है और फिर sleep
एस थोड़ी देर तक इसकी आवश्यकता होती है।
मैंने देखा है कि sleep()
सिस्टम निलंबन के साथ अजीब तरीके से इंटरैक्ट करता है: जब मैं सिस्टम निलंबन (लैपटॉप चल रहा है लिनक्स 3.16.0 कर्नेल) दर्ज करता हूं और फिर कंप्यूटर को बैक अप लेता हूं, sleep
निलंबन समय को नोटिस नहीं करता है। उदाहरण के लिए, ले निम्नलिखित sleep.c
:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char**argv)
{
time_t t=time(NULL);
printf("sleep at: %s", ctime(&t));
sleep(atoi(argv[1]));
t=time(NULL);
printf("wake at: %s", ctime(&t));
}
[email protected]:~$
संकलित, चलाने के लिए, और आधे रास्ते के माध्यम से सो;
$ gcc sleep.c -o sleep
$ ./sleep 30
sleep at: Fri Aug 21 21:05:36 2015
<suspend computer for 17 seconds>
wake at: Fri Aug 21 21:06:23 2015
वहाँ एक रास्ता घड़ी के समय बजाय प्रणाली सक्रिय रहने की अवधि -aware -aware है कि में प्रोग्राम निष्पादन को निलंबित करने का एक सही तरीका है?
(मैं भी usleep
की कोशिश की है, nanosleep
, और alarm
और पाया है कि वे इसी तरह व्यवहार करते हैं।)
अद्यतन:setitimer
, के रूप में @HuStmpHrrr ने सुझाव दिया, काफी होनहार लग रहा था ... लेकिन प्रतीत होता है एक ही समस्या है।
इस संस्करण का अनुरोध किया 30 से अधिक के लिए रुक जाता है जब मैं इसे के बीच में निलंबित ...
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>
void sighandler() {}
int main(int argc, char**argv)
{
time_t t=time(NULL);
printf("sleep at: %s", ctime(&t));
signal(SIGALRM, sighandler);
struct itimerval timer = {.it_interval={0,0},
.it_value={atoi(argv[1]),0}};
setitimer(ITIMER_REAL, &timer, NULL);
pause();
t=time(NULL);
printf("wake at: %s", ctime(&t));
}
किस बारे में 'alarm'? 'अलार्म() सेकेंड सेकेंड में कॉलिंग प्रक्रिया में एक SIGALRM सिग्नल को वितरित करने की व्यवस्था करता है।' वादा करता है। – HuStmpHrrr
'setitimer' अधिक नियंत्रण प्रदान करता है। आप जो चाहते हैं उसे प्राप्त करने के लिए आप 'ITIMER_REAL' में जा सकते हैं। – HuStmpHrrr
'setitimer' बहुत ही आशाजनक लग रहा था लेकिन ऐसा लगता है कि इसमें "डाउनटाइम" नहीं है। मतदान 'समय' काफी असाधारण समाधान की तरह लगता है लेकिन संभवतः सही :( –