Ваше запитання, здавалося, закликає до лісової відповіді, а відповіді тут схожі на дерева, тому я подумав, що я дам вам лісову відповідь.
Це дуже рідко, як написано програми 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 зазвичай не мають залежності від зовнішніх виконуваних файлів.