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