Bogusław Kempny

fork()

Autor adres
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 ....











Jeśli skomplilujecie i uruchomicie poprzedni program, zauważycie pewnie coś dziwnego.

Zniknął gdzieś ten czas 10 sekund przez jaki proces nadrzędny miał być uśpiony. Kończy on swoje działanie natychmiast.

No cóż, tak właśnie działa sleep(). Proces pozostaje uśpiony przez zadany czas, ale jeśli nadejdzie sygnał, przerywa swoje działanie. Jest to wyraźnie opisane w dokumentacji biblioteki GNU C.

Zwraca jednak ilość czasu, który pozostał do końca uśpienia. Jeśli nie zależy nam na bardzo precyzyjnym odmierzeniu czasu uśpienia, a przerwania nie przychodzą bardzo często, możemy z tego faktu skorzystać:

main (argc, argv)
{
signal(SIGCHLD, catch_CHLD);
 int m;
 int sleep_time;
 if (! (m = fork()) )
   {
     printf("Jestem procesem potomnym, koncze prace\n");
   }
 else
   {
     printf("Jestem procesem nadrzednym, zrobię sleep na 10 sekund\n"); fflush(0);
     sleep_time = 10;
       while (sleep_time > 0)
         sleep_time = sleep (sleep_time);
   }
}

Jeśli sleep() zwróci wartość większą od zera, zostanie wywołany ponownie, na czas który pozostał do końca pierwotnie wskazanego czasu. Niestety wartość pozostałego czasu zwracana przez sleep() wyrażona jest w sekundach, 7 sekund może znaczyć, że pozostało 6,65 sekundy albo 7,28. Przy większej liczbie przerwań błędy te mogą się kumulować, dlatego lepiej w takim przypadku skorzystac z pomiaru czasu korzystając z zegara sytemu, jak w przykładzie z programu obsługi serwera kamer lub skorzystać ze znacznie dokładniejszego nanosleep()