CGI è un protocollo di comunicazione tra webserver e un eseguibile. Vengono chiamati cgi degli eseguibili che sono in grado di dialogare con un webserver.

Il protocollo è molto semplice: il webserver setta alcune variabili d'ambiente, tramite cui passa i dati, e poi lancia l'eseguibile, che per ricevere i dati legge le suddette variabili d'ambiente, fa le sue elaborazioni e restituisce i risultati con un MIME compatibile con un webserver.

Non so come si faccia in C++ ma in Perl ad esempio i dati si ricevono con:

codice:
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
   @pairs = split(/&/, $buffer);
   foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
   }
dove $ENV{'CONTENT_LENGTH'} è la variabile d'ambiente ove è indicata la dimensione dell'input, STDIN è filehandle dove è l'input

per riestituire l'output si fa ad esempio così:

print "Content-type: text/html\n\n";
# abbiamo settato il MIME
print "<html>Ciao</html>";
# mandiamo il risultato.