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
English