Salut,
J'ai un petit problème dans une application serveur mono-thread "basique" qui boucle sur trois étapes :
- Attente d'une connexion avec accept().
- Traitement de la demande reçu (requête BD, exécution de programme externe, etc.).
- Envoi de la réponse au client.
Tout fonctionne correctement sauf dans un cas précis où j'exécute une commande externe avec un simple system() qui lance un script en tâche de fond :
Dans certain cas "monscript" peut être vraiment très long (plus de 5 minutes), et c'est pour cette raison je le lance en tâche de fond, surtout que je n'ai pas du tout besoin d'attendre qu'il soit fini pour renvoyer la réponse...
Code : Sélectionner tout - Visualiser dans une fenêtre à part system ("monscript &");
De ce point de vue là cela fonctionne "correctement" : le serveur continue, écrit la réponse dans la socket, la ferme et se remet en attente sur le accept().
Le problème étant que system() utilise un fork() qui duplique la table des descripteurs de fichier. Et donc mon script conserve la socket de réponse ouverte. Ainsi malgré que mon serveur ai bien envoyé la réponse, le client reste bloqué car il attend que la socket soit véritablement fermé... (et donc la fin du script).
Je voudrais donc remplacer l'utilisation du system() par un fork() que je gèrerais mon même et où je fermerais les descripteurs de fichier, par exemple :
Le problème étant que je ne n'ai pas accès à la socket ouverte à ce niveau là, mais surtout que je voudrais pour réutiliser le code et faire quelque chose de générique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 pid_t pid; pid = fork (); if (pid == 0) { /* Dans le processus fils */ /* COMMENT FAIRE : fermer tous les descripteurs de fichier autre que 0, 1 et 2 */ /* Puis on utilise system() tout simplement */ system("monscript &"); exit(0); }
Ma question est donc : comment fermer tous les descripteurs de fichier autre que stdin, stdout et stderr ?
a++
Partager