2009-12-23 5 views
1

Je travaille sur un script cgi encodeur audio qui utilise libmp3lame. J'écris dans un mélange de C/C++.Exécution d'un script CGI C++ en tant que processus d'arrière-plan?

Je prévois d'avoir un CGI de point d'entrée qui peut générer plusieurs processus de codage qui s'exécutent en arrière-plan. J'ai besoin que les processus d'encodage soient asynchrones car l'encodage peut prendre plusieurs heures mais j'ai besoin que le cgi du point d'entrée revienne instantanément pour que le navigateur puisse continuer à travailler.

J'ai trouvé plusieurs solutions pour cela (certaines sont complètes/d'autres non) mais il y a encore quelques choses que j'aimerais clarifier.

Solution 1 (le plus facile): Le cgi entrée de point est un script bash qui peut alors exécuter un C++ processus cgi en arrière-plan en envoyant la sortie vers/dev/null/2/&> 1 & (simples mais pas très élégant).

Solution 2: Tout comme solution 1, à l'exception du cgi point d'entrée est en C++ et utilise le système() pour exécuter le proc/s et envoyer la sortie vers/dev/null/2/&> 1 & nouveau.

[question] Cela fonctionne bien mais je ne suis pas sûr si les sociétés d'hébergement mutualisées permettent l'utilisation de la fonction system(). Est-ce le cas?

Solution 3 (incomplète): J'ai examiné en utilisant fork()/pthread_create() pour engendrer des threads séparés qui semble plus élégant que je peux rester dans les domaines de C. Le seul problème étant: Il semble que le le thread parent ne quitte pas tant que tous les threads enfants ne sont pas retournés.

[question] Existe-t-il un moyen de sortir le thread parent tout en permettant aux threads fils de continuer en arrière-plan. [Idée] Peut-être que je peux envoyer la sortie enfant proc/s au trou noir! Puis-je simplement rediriger stdout vers/dev/null. Si oui, comment je fais ça?

J'espère que cela a du sens pour quelqu'un. Je suis encore un peu un noob avec des trucs en C, donc il me manque des concepts très basiques (merci d'avoir pitié!).

Je serais très reconnaissant de tout conseil à ce sujet.

Un grand merci à l'avance,

Josh

+0

lire ce lien: http://apidock.com/ruby/Process/detach/class – whunmr

Répondre

3

Vous voulez sans doute la technique standard démon Unix, impliquant une double fourche:

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); 
} 

On dirait que les machines Linux modernes disposent d'une fonction de bibliothèque daemon() que fait probablement la même chose.

Il est possible que le premier exit soit _exit, mais ce code a toujours fonctionné pour moi.

+0

Excellent. Je ne l'ai pas rencontré auparavant. Je vais faire des tests. J'écrirai de nouveau dans un peu. Merci pour la réponse. – Josh

+0

Wow! Travaillé directement hors de la boîte. Je vous remercie. Je ne comprends pas très bien le fs démonter - mais bon, ça marche! À votre santé. Josh. – Josh

+0

Chaque processus contiendra une référence à son répertoire de travail actuel.Si vous essayez de démonter un système de fichiers (même un lecteur flash discret) alors que quelqu'un détient encore des références à quelque chose dans le système de fichiers, il échouera. Cela peut sembler assez mystérieux si c'est un programme fonctionnant en arrière-plan qui maintient ce système de fichiers. La pratique courante pour les démons est de 'chdir ("/")', donc ce genre de chose n'arrive pas. –

Questions connexes