Votre question semblait appeler une réponse de la forêt, et les réponses ici ressemblent à des réponses d'arbres, alors j'ai pensé vous donner une réponse de la forêt.
C’est très rarement la façon dont les programmes C sont écrits. C'est toujours comment les scripts shell sont écrits, et parfois comment les programmes Python, perl ou Ruby sont écrits.
Les utilisateurs écrivent généralement en C pour une utilisation facile des bibliothèques système et un accès direct de bas niveau aux appels système du système d'exploitation, ainsi que pour la rapidité. C étant un langage difficile à écrire, si les utilisateurs n'en ont pas besoin, ils n'utilisent pas C. De plus, les programmes C ne doivent généralement dépendre que de bibliothèques partagées et de fichiers de configuration.
Faire appel à un sous-processus n'est pas particulièrement rapide, il ne nécessite pas un accès fin et contrôlé aux installations système de bas niveau, et il introduit une dépendance éventuellement surprenante à un exécutable externe. Il est donc rare de voir dans les programmes en C.
Il y a quelques préoccupations supplémentaires. Les problèmes de sécurité et de portabilité que les gens mentionnent sont tout à fait valables. Bien sûr, ils sont également valables pour les scripts shell, mais les gens s’attendent à ce genre de problèmes dans les scripts shell. Mais les programmes C ne sont généralement pas censés présenter ce type de problème de sécurité, ce qui le rend plus dangereux.
Mais, à mon avis, la plus grande préoccupation concerne la manière dont le système popen
va interagir avec le reste de votre programme. popen
doit créer un processus enfant, lire sa sortie et collecter son statut de sortie. Dans l'intervalle, le processus stderr de ce processus sera connecté au même réseau que votre programme, ce qui peut entraîner des résultats confus, et son stdin sera identique à votre programme, ce qui pourrait entraîner d'autres problèmes intéressants. Vous pouvez résoudre ce problème en incluant </dev/null 2>/dev/null
dans la chaîne à laquelle vous passez popen
car elle est interprétée par le shell.
Et popen
crée un processus enfant. Si vous faites vous-même quelque chose avec des processus de traitement du signal ou de traitement du signal, vous risquez de recevoir des SIGCHLD
signaux étranges . Vos appels à wait
peuvent interagir étrangement popen
et éventuellement créer d’étranges conditions de concurrence.
Les problèmes de sécurité et de portabilité sont bien sûr présents. Comme pour les scripts shell ou tout ce qui lance d'autres exécutables sur le système. Et vous devez faire attention que les personnes utilisant votre programme ne sont pas en mesure d'obtenir des méta-charcaters shell dans la chaîne que vous passez en popen
car cette chaîne est donnée directement sh
avec sh -c <string from popen as a single argument>
.
Mais je ne pense pas que ce soit la raison pour laquelle il est étrange de voir un programme C utiliser popen
. La raison pour laquelle c'est étrange, c'est parce que C est généralement un langage de bas niveau et popen
n'est pas un bas niveau. Et parce que l'utilisation de popen
contraintes de conception sur votre programme entraîne des interactions étranges avec les entrées et sorties standard de votre programme, ce qui complique la gestion de votre propre processus ou de la gestion du signal. Et parce que les programmes C ne sont généralement pas censés avoir des dépendances sur les exécutables externes.