Bogusław Kempny

fork()

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











Proces potomny dostaje do dyspozycji własną kopię obszaru danych i kodu procesu nadrzędnego, a także kopie deskryptorów otwartych plików i połączeń sieciowych.

Nie jest w stanie zniszczyć danych programu nadrzędnego, bo działa na własnej kopii.

To, że proces potomny może zmienić zawartość pliku otwartego przez proces nadrzędny jest oczywiste, programista powinien wziąć to pod uwagę.

W przypadku otwartych plików i połączeń sieciowych sytuacja nie jest już tak jasna. Dla przykładu:

  mysql_init (&mysql);
  mysql_real_connect (&mysql, "localhost", "rcp", "Akuku", "rcp", 0, NULL, 0)
  if (! (m = fork()) )
   {
//  proces potomny, coś robi, po czym wysyła zapytanie do bazy danych
    sprintf(buf, "Select * from wydzialy where idw > 100);
    mysql_query (&mysql, &buf[0]);
   }
  else
   {
//  proces nadrzedny, coś robi, po czym też wysyła zapytanie do bazy danych
    sprintf(buf, "Select id_drzwi from drzwi where nr_drzwi=23");
    mysql_query (&mysql, &buf[0]);
   }

Jeśli zapytanie do bazy danych z jednego procesu zostanie zadane w trakcie wykonywania zapytania przez drugi proces, nic dobrego z tego nie wyniknie.
Oba procesy korzystają z tej samej struktury MYSQL, nasz program 'wybuchnie', motor bazy danych nie spodziewa się dwu zapytań na tym samym połączeniu w tym samym czasie.

Jeśli zapytania nie będą sie zdarzały w tym samym czasie, wszystko będzie OK.