Pertanyaan Anda sepertinya membutuhkan jawaban hutan, dan jawaban di sini seperti jawaban pohon, jadi saya pikir saya akan memberi Anda jawaban hutan.
Ini sangat jarang bagaimana program C ditulis. Selalu bagaimana skrip shell ditulis, dan kadang-kadang bagaimana program Python, perl atau Ruby ditulis.
Orang-orang biasanya menulis dalam bahasa C agar mudah menggunakan perpustakaan sistem dan mengarahkan akses tingkat rendah ke panggilan sistem OS serta untuk kecepatan. Dan C adalah bahasa yang sulit untuk ditulis, jadi jika orang tidak membutuhkan hal-hal itu, maka mereka tidak menggunakan C. Juga program C biasanya hanya bergantung pada pustaka bersama dan file konfigurasi.
Keluar ke sub-proses tidak terlalu cepat, dan tidak memerlukan akses yang baik dan terkendali ke fasilitas sistem tingkat rendah, dan memperkenalkan ketergantungan yang mungkin mengejutkan pada eksekusi eksternal, sehingga tidak biasa untuk melihat dalam program C.
Ada beberapa kekhawatiran tambahan. Masalah keamanan dan portabilitas yang disebutkan orang sepenuhnya valid. Mereka sama-sama valid untuk skrip shell tentu saja, tetapi orang-orang mengharapkan masalah semacam itu dalam skrip shell. Tetapi program C biasanya tidak diharapkan memiliki kelas masalah keamanan ini, yang membuatnya lebih berbahaya.
Tapi, menurut saya, masalah terbesar yang harus dilakukan dengan cara popen
akan berinteraksi dengan seluruh program Anda. popen
harus membuat proses anak, membaca outputnya dan mengumpulkan status keluarnya. Sementara itu, stderr proses itu akan terhubung ke stderr yang sama dengan program Anda, yang dapat menyebabkan output membingungkan, dan stdinnya akan sama dengan program Anda, yang dapat menyebabkan masalah menarik lainnya. Anda dapat menyelesaikannya dengan memasukkan </dev/null 2>/dev/null
string yang Anda lewati popen
karena ditafsirkan oleh shell.
Dan popen
menciptakan proses anak. Jika Anda melakukan sesuatu dengan penanganan sinyal atau proses forking sendiri, Anda mungkin akan mendapatkan SIGCHLD
sinyal aneh . Panggilan Anda untuk wait
dapat berinteraksi secara aneh dengan popen
dan mungkin menciptakan kondisi balapan yang aneh.
Masalah keamanan dan portabilitas tentu saja ada. Karena mereka untuk skrip shell atau apa pun yang menjalankan executable lain pada sistem. Dan Anda harus berhati-hati bahwa orang-orang menggunakan program Anda tidak bisa mendapatkan shell meta-charcaters ke string Anda masuk ke popen
karena string yang diberikan langsung ke sh
dengan sh -c <string from popen as a single argument>
.
Tapi saya tidak berpikir mereka mengapa aneh melihat program C menggunakan popen
. Alasannya aneh adalah karena C biasanya bahasa tingkat rendah, dan popen
bukan tingkat rendah. Dan karena menggunakan popen
batasan desain tempat pada program Anda karena itu akan berinteraksi aneh dengan input dan output standar program Anda dan membuatnya susah untuk melakukan manajemen proses atau penanganan sinyal Anda sendiri. Dan karena program C biasanya tidak diharapkan memiliki ketergantungan pada executable eksternal.