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 popenva interagir avec le reste de votre programme. popendoit 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/nulldans la chaîne à laquelle vous passez popencar elle est interprétée par le shell.
Et popencré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 SIGCHLDsignaux étranges . Vos appels à waitpeuvent interagir étrangement popenet é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 popencar cette chaîne est donnée directement shavec 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 popenn'est pas un bas niveau. Et parce que l'utilisation de popencontraintes 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.