Bogusław Kempny

Serwer kamer

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










Mamy już połączenie z klientem, odbieramy numer kamery które ma zrobic zdjęcie i nazwę pod jaką je zapisac:

    /* czytaj rozkazy z serwera  */
     bzero(buf,10);
// Odczytaj numer portu usb kamery
     time (&czas1);
     time (&czas2);
     m=0;
     while (czas2 - czas1 < 5) // 5 sekund na odczyt, potem timeout
     {
      if ((read (newsockfd, &buf[m], 1)) != -1)

        {
         if( m>100)  break; // padl port 
         if (buf[m] == 0x0a)
          {
            buf[m+1]=0x0;
            wynik=1;
            break;
          }
         m++;
        }
      time (&czas2);
     }

// Odczytaj numer zdjecia
     time (&czas1);
     time (&czas2);
     m=0;
     while (czas2 - czas1 < 5) // 5 sekund na odczyt, potem timeout
     {
      if ((read (newsockfd, &buf1[m], 1)) != -1)
        {
         if( m>100)  break; // padl port 
         if (buf1[m] == 0x0a)
          {
            buf1[m+1]=0x0;
            wynik=1;
            break;
          }
         m++;
        }
      time (&czas2);
     }
I robimy zdjęcia.
Skryptem w shell który wcześniej opisaliśmy.
Uruchamiamy go funkcją execl podając jako parametry numer kamery i nazwę zdjęcia.

Użycie funkcji fork() spowoduje utworzenie procesu będącego kopią procesu który jej użył.
Czy po jej użyciu jesteśmy w procesie który ją wywołał, czy w procesie potomnym, rozpoznać możemy po tym, jaką wartość zwróciła funkcja fork().
W procesie nadrzędnym będzie to wartość PID procesu potomnego, w procesie potomnym wartość zero.
Dlatego execl wykona się tylko w procesie potomnym, który nie spiesząc się może robić zdjęcia.
Proces nadrzędny zamyka połączenie sieciowe z klientem i czeka na obsłużenie kolejnego.

     if (! (m = fork()) )
       execl("/home/rcp/pstryk", "/home/rcp/pstryk", buf, buf1, (char *)0);

     shutdown(newsockfd, 2);
     close(newsockfd);
   } //od while true