2017-12-15 2 views
0

Ich mache ein Schulprojekt (muss in C entwickelt werden) und ich brauche es, um jeden X-Sekunden und Y-Sekunden nach der Ausführung des Programms Code auszuführen gestartet muss es enden.sleep() C gibt nicht den richtigen Wert zurück

Also schrieb ich:

alarm(Y); 
s=X; 
while(!end){ 
    s = sleep(s); //because it generates some children that send signal to him and in that case i need to do other stuffs 
    if(s == 0){ 
     //code to do each X seconds 
    } 
} 

Die Variable end eine globale Variable auf 0 initialisiert ist, und wenn ein SIGALARM der Wert wird empfangen 1.

Wenn ich bekam haben X> Y der Code sollten alle X Sekunden nicht ausgeführt werden, aber wenn X = Y + 1, wird es einmal ausgeführt.

Können Sie mir sagen, warum dies geschieht?

+0

Ich bin nicht sehr klar, ich verstehe Sie Problem mit Englisch, aber, können Sie grafisch sein ?, wie eine Zeitlinie für Operationen? –

+3

[_mixing Anrufe an Alarm (2) und Schlaf() ist eine schlechte Idee._] (https://linux.die.net/man/3/sleep) –

+0

Wenn auch das Handbuch des Schlafes sagt Mischen Alarm und Schlaf ist eine schlechte Idee, du solltest nicht einmal daran denken. – joemartin94

Antwort

2

Per the manual:

BESCHREIBUNG

sleep() bewirkt, dass der aufrufenden Thread, entweder bis die Anzahl von Echtzeit-Sekunden in Sekunden angegeben schlafen müssen verstrichene oder bis ein Signal ankommt, das ist nicht ignoriert.

UCKGABEWERT

Null, wenn die angeforderte Zeit abgelaufen ist, oder die Anzahl der Sekunden links zu schlafen, wenn der Anruf von einem Signal-Handler unterbrochen wurde.

Ihre Nutzung von alarm() fast sicher unterbricht Ihren sleep() Anruf.

Und selbst wenn alarm() nicht störte, sleep() kann immer ohnehin durch ein Signal unterbrochen werden, und Sie haben, dass in geeigneter Weise zu handhaben.

0

Dies ist einfach mit nur sleep() zu tun:

#include <stdio.h> 
#include <unistd.h> 

int main(void) { 
    unsigned int const y = 5; 
    unsigned int const x = 2; 

    { 
    unsigned int left = y; 
    unsigned int action = 0; 
    while (left > 0) { 
     unsigned int time = x - action < left ? x - action : left; 
     printf("I will sleep for %u\n", time); 
     { 
     unsigned ret = sleep(time); 

     action += time - ret; 
     if (action >= x) { 
      printf("do something\n"); 
      action -= x; 
     } 

     left -= time - ret; 
     } 
    } 
    } 
} 

Aber beachten Sie, dass es eindeutig nicht korrekt ist, gibt es eine bessere Methode, die sleep() mit POSIX-Standard wie clock_gettime() und nanosleep() oder clock_nanosleep().

Verwandte Themen