Esecuzione di script C ++ C ++ come processo in background?

Sto lavorando a uno script cgi codificatore audio che utilizza libmp3lame. Sto scrivendo in una miscela di C / C ++.

Ho in programma di avere un cgi entry-point in grado di generare più processi di codifica eseguiti in background. Ho bisogno che i processi di codifica siano asincroni in quanto la codifica può richiedere diverse ore, ma ho bisogno che il cgi entry-point ritorni istantaneamente in modo che il browser possa continuare sulla sua attività.

Ho trovato diverse soluzioni per questo (alcune complete / alcune no) ma ci sono ancora alcune cose che vorrei chiarire.

Soluzione 1 (più semplice): il cgi entry-point è uno script bash che può quindi eseguire un cgi di processo C ++ in background inviando l’output a / dev / null / 2 / &> 1 & (simples! Ma non molto elegante).

Soluzione 2: Molto simile alla soluzione 1, eccetto che il cgi entry-point è in C ++ e usa system () per eseguire proc / se inviare l’output a / dev / null / 2 / &> 1 e ancora.

[domanda] Funziona bene ma non sono sicuro che le società di hosting condiviso consentano l’uso della funzione system (). È questo il caso?

Soluzione 3 (incompleta): ho cercato di usare fork () / pthread_create () per generare thread separati che sembrano più eleganti in quanto posso rimanere nei regni di C. L’unico problema è che sembra che il thread principale non lo faccia t esci finché non vengono restituiti tutti i thread figlio.

[domanda] Esiste un modo per far uscire il thread principale mentre consente ai thread secondari di continuare in background.

[idea] Forse posso inviare l’uscita proc / s del bambino al buco nero! Posso semplicemente redirect lo stdout su / dev / null. Se sì, come faccio a fare questo?

Spero che questo abbia senso per qualcuno. Sono ancora un po ‘un noob con la roba di C, quindi potrei mancare dei concetti molto basilari (per favore abbi pietà!).

Sarei molto grato di qualsiasi consiglio in merito.

Molte grazie in anticipo,

Josh

Probabilmente vuoi la tecnica daemon standard Unix, che coinvolge una doppia fork:

void daemonize(void) { if (fork()) exit(0); // fork. parent exits. setsid(); // become process group leader if (fork()) _exit(0); // second parent exits. chdir("/"); // just so we don't mysteriously prevent fs unmounts later close(0); // close stdin, stdout, stderr. close(1); close(2); } 

Sembra che le macchine Linux moderne abbiano una funzione di libreria daemon() che presumibilmente fa la stessa cosa.

È ansible che la prima exit sia _exit , ma questo codice ha sempre funzionato per me.