Ваше запитання, здавалося, закликає до лісової відповіді, а відповіді тут схожі на дерева, тому я подумав, що я дам вам лісову відповідь.
Це дуже рідко, як написано програми C. Сценарії оболонки завжди написані, а іноді, як написані програми Python, perl або Ruby.
Зазвичай люди пишуть на C для зручного використання системних бібліотек та прямого доступу низького рівня до системних дзвінків ОС, а також для швидкості. І C - це складна мова для запису, тому якщо людям не потрібні ці речі, то вони не використовують C. Також, як правило, програми C мають залежність лише від спільних бібліотек та файлів конфігурації.
Обстріл до підпроцесу не особливо швидкий, і він не вимагає дрібнозернистого і контрольованого доступу до системних об'єктів низького рівня, і він вносить, можливо, дивовижну залежність від зовнішнього виконуваного файлу, тому це рідко можна побачити в програмах на С.
Є деякі додаткові проблеми. Безпека та портативність, про які згадують люди, є повністю дійсними. Вони однаково справедливі для скриптів оболонок, звичайно, але люди очікують таких проблем у скриптах оболонок. Але зазвичай не передбачається, що програми C мають такий клас безпеки, що робить його більш небезпечним.
Але, на мою думку, найбільші занепокоєння стосуються того, як popenбуде взаємодіяти з рештою вашої програми. popenмає створити дочірній процес, прочитати його вихід і зібрати його вихідний статус. Тим часом, цей процес 'stderr буде підключений до того ж stderr, що і ваша програма, що може спричинити заплутаний вихід, а його stdin буде таким же, як і ваша програма, що може спричинити інші цікаві проблеми. Ви можете вирішити це, включивши </dev/null 2>/dev/nullв рядок, який ви передаєте, popenоскільки він інтерпретується оболонкою.
І popenстворює процес дитини. Якщо ви що-небудь робите з обробкою сигналів або розгортанням процесів самостійно, ви можете отримати незвичайні SIGCHLDсигнали. Ваші дзвінки waitможуть дивно взаємодіяти popenі, можливо, створювати дивні умови для гонки.
Безпека та переносимість існують, звичайно,. Як і для скриптів оболонки або будь-якого іншого, що запускає інші виконувані файли в системі. І ви повинні бути обережні , що люди , які використовують програми не в змозі отримати оболонки мета-charcaters в рядок ви передаєте в popenтому , що рядок задається безпосередньо shз sh -c <string from popen as a single argument>.
Але я не думаю , що вони чомусь - то дивно бачити програму C допомогою popen. Причиною це дивно є те, що C зазвичай є мовою низького рівня, а popenне низьким рівнем. І тому, що використання popenобмежувачів дизайну місць у вашій програмі, тому що це буде дивно взаємодіяти зі стандартним входом та виходом вашої програми і доставить біль для власного управління процесами чи обробки сигналів. А тому, що програми C зазвичай не мають залежності від зовнішніх виконуваних файлів.