Sleep() macht nicht das was es soll

Gast #4041490
Lesenswert?
• ▲
▼
Vorab: Ich bin neu in der Linux-Welt und kenne mich im Grunde nur mit 
PICs und AVRs aus.

Der Code ist cross-compiliert für einen Raspberry Pi und sollte 
eigentlich gehen.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <time.h>
4
#include <unistd.h>
5
#include "c_gpio.h"
6

7
int main(void) {
8
  printf("\nTest_1 Timing\n");
9
  printf  ("=============\n");
10
  int i;
11
  for (i = 0; i<10; i++){
12
    sleep(1);
13
    //DelayMicrosecondsNoSleep (1000000); <- funktioniert nicht
14
    printf ("%i, ", i);
15
  }
16
  printf ("\n");
17
  return EXIT_SUCCESS;
18

19
}
Eigentlich erwarte ich, daß nach jeder Sekunde i schön artig um 1 erhöht 
und printf aufgerufen wird. Das ist aber nicht so, stattdessen passiert 
10 sek lang gar nichts, danach zeigt printf alle Zahlen von 0 bis 9.


Wenn ich zusätzlich aber das hier in die for-Schleife einfüge, 
funktioniert's.
1
s = sleep(1);
2
printf ("sleep(1): %i\n", s);
pi@raspberrypi ~/c-stuff $ ./test_1

Test_1 Timing
=============
sleep(1): 0
0, sleep(1): 0
1, sleep(1): 0
2, sleep(1): 0
3, sleep(1): 0
4, sleep(1): 0
5, sleep(1): 0
6, sleep(1): 0
7, sleep(1): 0
8, sleep(1): 0
9,


Warum ist das so?

Das hab ich in unistd.h gefunden:
1
/* Make the process sleep for SECONDS seconds, or until a signal arrives
2
   and is not ignored.  The function returns the number of seconds less
3
   than SECONDS which it actually slept (thus zero if it slept the full time).
4
   If a signal handler does a `longjmp' or modifies the handling of the
5
   SIGALRM signal while inside `sleep' call, the handling of the SIGALRM
6
   signal afterwards is undefined.  There is no return value to indicate
7
   error, but if `sleep' returns SECONDS, it probably didn't work.
8

9
   This function is a cancellation point and therefore not marked with
10
   __THROW.  */
Steht das damit im Zusammenhang?
Moderator Persönliche Seite #4041502
Lesenswert?
• ▲
▼
Schnarcher schrieb:
> Eigentlich erwarte ich, daß nach jeder Sekunde i schön artig um 1 erhöht
> und printf aufgerufen wird. Das ist aber nicht so, stattdessen passiert
> 10 sek lang gar nichts, danach zeigt printf alle Zahlen von 0 bis 9.

Es fehlt ein

    fflush(stdout);

nach dem printf().

Also:

    printf ("%i, ", i);
    fflush(stdout);

Die stdio-Bibliothek buffert. Bei Consolen/Terminals bis zum nächsten 
'\n'. Mit fflush() kannst Du die Ausgabe erzwingen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.