- Exec menggantikan program yang sedang berjalan tanpa mengubah PID dan digunakan bersama fork() untuk memuatkan fail boleh laku baharu dalam C dan persekitaran Unix.
- Dalam shell, exec membolehkan anda menggantikan shell itu sendiri atau mengkonfigurasi semula deskriptor dan pengalihan fail secara global.
- Dalam Perl, exec dan system menguruskan pelaksanaan arahan luaran dengan tingkah laku yang berbeza, bergantung pada fungsi dan modul seperti Shell.
- Menguasai deskriptor eksekutif dan fail adalah kunci untuk menulis skrip dan program yang mantap, sekali gus mengawal input dan output secara menyeluruh.

Apabila anda mula bekerja dengan serius dengan baris arahan GNU/Linux, lambat laun anda akan menemui arahan exec misteri dan fungsi exec C dalam Program boleh laku UnixPada mulanya, kelakuannya agak membimbangkan: kadangkala skrip Ia "hilang" dan berhenti melaksanakan baris; pada masa lain ia digunakan untuk melakukan pengalihan fail yang luar biasa atau untuk melancarkan proses jauh. Semuanya kedengaran sangat rendah, tetapi di situlah terletaknya kuasanya.
Dalam artikel ini, kita akan menguraikan kerumitan itu. Anda akan melihat bagaimana exec boleh membawa maksud yang berbeza bergantung kepada sama ada kita bercakap tentang shell, C, atau bahasa seperti Perl.dan bagaimana ia sesuai dengan bahagian asas lain seperti fork(), system, deskriptor fail atau arahan seperti findIdeanya adalah anda akan mendapat visi yang praktikal dan komprehensif, dan tangan anda tidak akan menggeletar apabila anda melihat exec dalam skrip atau dalam kod sumber.
Apakah exec dalam Unix/Linux: idea umum
Dalam kernel Unix, exec ialah mekanisme untuk menggantikan program yang sedang berjalan. oleh yang berbeza dalam proses yang sama. Iaitu: proses tersebut tidak mati dan mencipta yang lain, tetapi sebaliknya "imej memori"-nya digantikan dengan program baharu. PID kekal sama, tetapi kod dan data menjadi kod dan data boleh laku baharu.
Dari sudut pandangan praktikal, ini bermakna bahawa Fungsi C exec tidak akan kembali jika semuanya berjalan lancar.Panggilan tersebut menggantikan program semasa dengan yang baharu, dan anda hanya akan melihat nilai pulangan jika ralat telah berlaku (contohnya, fail boleh laku tidak wujud atau anda tidak mempunyai kebenaran).
Konsep ini tercermin dalam pelbagai peringkat:
- dalam C: keluarga fungsi
exec*(execl,execv,execve,execvp, dan lain-lain.). - Dalam cangkerang (Bash, sh, dll.): arahan dalaman
exec, yang boleh menggantikan shell dengan program atau memanipulasi deskriptor fail. - Dalam bahasa seperti Perl: fungsi
execyang bertindak serupa, dengan nuansa berbanding dengansystem.
Rahmat itu Semua kegunaan ini berkongsi idea asas yang sama: untuk berhenti melaksanakan apa yang sedang dilakukan dan, dalam proses yang sama, beralih kepada melaksanakan sesuatu yang lain, o mengubah suai cara proses tersebut berkomunikasi dengan dunia luar melalui deskriptor.
Keluarga eksekutif dalam C: menggantikan imej proses

En pengaturcaraan sistem dengan C dalam Linux, yang Keluarga fungsi exec ialah alat standard untuk memuatkan program lain ke dalam proses semasa.Ia biasanya muncul di sebelah fork(), yang bertanggungjawab untuk mencipta proses anak.
Definisi umum ialah exec menggantikan ruang memori proses (kod, data, tindanan, dll.) dengan kod program yang berbeza. Sistem pengendalian menyediakan imej baharu ini dan melompat ke titik masuknya seolah-olah ia telah but dari awal, tetapi menggunakan semula PID yang sama.
yang varian yang paling biasa bunyi:
int execl(const char *path, const char *arg, ...);int execv(const char *path, char * const argv[]);int execve(const char *path, char * const argv[], char * const envp[]);int execvp(const char *file, char * const argv[]);
Dalam kesemuanya, path ialah laluan mutlak kepada fail boleh laku, kecuali dalam execvpdi mana anda hanya boleh lulus nama itu dan ia akan mencari dalam direktori yang ditakrifkan dalam pembolehubah persekitaran PATHJika fail boleh laku diedarkan sebagai Format AppImagePanggilan masih terpakai. Argumen program baharu diluluskan sebagai senarai pembolehubah (execl) atau sebagai tatasusunan (execv dan syarikat).
Adalah penting untuk memahami bahawa Fungsi-fungsi ini hanya mengembalikan -1 jika ia gagal. (Program baharu belum lagi dilaksanakan.) Dalam kes biasa, pelaksanaan tidak kembali ke titik panggilan, kerana kod proses sudah berbeza.
Hubungan antara fork() dan exec(): mencipta proses dan melaksanakan program
Dalam Linux, adalah kebiasaan untuk membezakan dengan jelas antara Dua idea: mencipta proses dan melaksanakan programProses tidak sama dengan yang boleh dilaksanakan, walaupun ia berkaitan.
Untuk mencipta proses baharu daripada proses sedia ada, anda menggunakan fork()Panggilan ini, secara ringkasnya, membuat salinan proses induk yang hampir sama: kod yang sama, keadaan pembolehubah yang sama, fail terbuka yang sama, dsb. Anak menerima nilai pulangan. 0 en fork()sementara bapa menerima PID anak lelakinya. Jika berlaku sesuatu yang tidak kena, kedua-duanya akan melihat -1.
Salinan ini tidaklah sekasar yang didengari kerana teknik seperti Salin-Semasa-Tulis (COW)Ini digunakan oleh sistem pengendalian untuk menangguhkan penyalinan sebenar halaman memori sehingga salah satu proses cuba mengubah suainya. Ini mengelakkan replikasi sejumlah besar memori hanya untuk membuangnya serta-merta jika proses dipanggil kemudian. exec().
Kebiasaannya bapalah yang menjaga cipta proses anak dengan fork() dan mewakilkan kerja sebenar kepada merekaKanak-kanak itu, setelah diciptakan, melaksanakan exec() untuk memuatkan program yang sebenarnya kita minati. Dengan cara ini, Bapa boleh terus melahirkan lebih ramai anak atau menunggu sehingga seorang selesai. menggunakan wait(), yang menyekatnya sehingga kanak-kanak itu selesai.
Menggabungkan kedua-dua bahagian biasanya menghasilkan corak sebagai:
- Bapa itu memanggil
fork(). - Dalam proses anak, salah satu fungsi dipanggil.
exec*dengan program yang dikehendaki, sepertils -l. - Ibu bapa memantau atau menyegerakkan penyiapan anak dengan
wait().
Model klasik ini mempunyai beberapa Ketidakcekapan timbul apabila salinan besar proses dibuat hanya untuk segera menggantikannya dengan exec()</codeOleh itu, kepentingan COW dan pemahaman yang jelas tentang peranan setiap panggilan dalam kitaran hayat proses.
Perintah exec dalam shell: menggantikan shell dan bermain dengan deskriptor
Dalam Bash dan shell lain, exec Ia terbina dalam dengan dua kegunaan hebat: gantikan shell dengan arahan lain dan ubah suai konfigurasi deskriptor fail shell tersebut.
Kes yang paling langsung ialah apabila usa exec diikuti dengan arahan. Sebagai contoh:
exec wall "Mensaje para todos los usuarios"
Di sini, shell yang melaksanakannya exec tidak lagi wujud dan digantikan dengan arahan wallSemua yang datang selepas baris itu dalam skrip tidak akan dilaksanakan, kerana secara literal tiada shell yang tinggal untuk mentafsirkannya.
Walau bagaimanapun, penggunaan yang paling menarik dalam skrip biasanya yang lain: menggunakan exec dengan pengalihan untuk mengkonfigurasi semula deskriptor fail secara global untuk sesi atau skrip. Contohnya, anda boleh mempunyai output standard pergi ke /dev/null:
exec 1>/dev/null
Sejak itu, Sebarang arahan yang anda taip dalam shell itu tidak akan memaparkan apa-apa pada skrinkerana deskriptornya 1 (stdout) menunjuk kepada /dev/nullPerkara yang hebat ialah ini menjejaskan keseluruhan shell, bukan hanya arahan tertentu.
Anda juga boleh buka deskriptor tambahan berkaitan dengan fail:
exec 3>>/tmp/salida.log
Dengan cara ini, Deskriptor 3 menjadi saluran output kepada /tmp/salida.logSemua yang anda halakan semula >&3 Ia akan pergi ke fail itu, manakala output standard yang lain akan kekal pada skrin, atau di mana sahaja anda telah menyediakannya.
Penting untuk mengingatnya shell mengekalkan kedudukan dalam fail yang berkaitan dengan deskriptorJika anda menulis beberapa kali, penunjuk akan maju; jika anda cuba membaca daripada deskriptor itu, anda mungkin sudah berada di penghujung fail dan tidak mendapat apa-apa. Apabila anda ingin menutup deskriptor, sila:
exec 3>&-
Ini memberitahu shell untuk berhenti menggunakan saluran tersebut. Trik Mereka sangat berguna untuk struktur balak dalam skrip kompleks atau memisahkan pelbagai jenis output ke dalam fail yang berbeza tanpa perlu mengalihkan setiap arahan secara individu.
Contoh lanjutan bagi pelaksanaan shell: pengalihan global
Dalam skrip yang agak rumit, ia adalah perkara biasa simpan keadaan asal deskriptor dan kemudian alihkannya buat sementara waktu untuk membuang output ke log, fail sementara atau pun ke /dev/null.
Corak tipikal terdiri daripada salin dahulu output standard kepada deskriptor tambahan dan kemudian mengalihkan output standard ke fail:
exec 3>&1
exec 1>/tmp/salida.txt
Dengan serpihan ini, Deskriptor 3 menunjukkan output yang dimiliki oleh deskriptor 1 sebelum ini. (The terminal (biasanya), dan kemudian deskriptor 1 disambungkan ke fail /tmp/salida.txtMulai saat itu, semua yang dicetak ke stdout dari arahan skrip akan pergi ke fail tersebut.
Kemudian, apabila anda tidak lagi mahu meneruskan rakaman dalam fail tersebut, anda boleh memulihkan keadaan asal mengembalikan output standard kepada deskriptor 3 dan menutup yang terakhir:
exec 1>&3
exec 3>&-
Mengikuti baris-baris ini, Arahan-arahan tersebut sekali lagi memaparkan outputnya pada skrin.dan deskriptor tambahan dilepaskan. Ia merupakan penyelesaian bersih untuk merangkum bahagian skrip yang perlu direkodkan tanpa menyusahkan arahan lain dengan pengalihan.
Ia juga mungkin alihkan input shell standard ke failsupaya semua bacaan stdin datang dari situ, yang boleh berguna dalam automasi tertentu atau dalam ujian di mana anda ingin memasukkan skrip dengan data yang telah dirakam terlebih dahulu.
Perintah baca dan hubungannya dengan deskriptor
Dalam ekosistem cangkerang, read Ia adalah arahan yang bertanggungjawab untuk membaca daripada input standard dan menyimpan hasil dalam pembolehubahSecara lalai, ia membaca sehingga menemui pemisah baris, tetapi kelakuannya boleh ditala dengan beberapa pilihan.
cara paling mudah Ia adalah:
read MIVAR
Dengan ini, Rentetan yang anda taip pada papan kekunci sehingga anda menekan Enter disimpan dalam MIVARAgak biasa untuk menambah pilihan -r supaya tanda garis miring terbalik tidak ditafsirkan sebagai aksara pelarian:
read -r MIVAR
Terdapat pilihan yang sangat berguna seperti -pyang membolehkan anda memaparkan teks gesaan, Dan -syang menghalang apa yang anda taip daripada bergema di skrinItulah yang anda gunakan apabila anda ingin meminta kata laluan dalam skrip:
read -s -p "Contraseña: " PASSWD
Dalam kes ini, Anda tidak akan melihat aksara yang anda taip, sama seperti apabila anda menjalankan su o sudo. Juga, read Ia berkait rapat dengan pembolehubah khas. IFS, yang mentakrifkan aksara mana yang dianggap sebagai pemisah medan (secara lalai tab, ruang dan pemisah baris).
Jika anda melakukan sesuatu seperti:
IFS="-"; read A B C
Perintah itu akan mentafsirkan aksara tanda hubung sebagai pemisahMengagihkan medan baca antara pembolehubah A, B dan C. Jika terdapat lebih banyak pembolehubah daripada medan, medan tersebut akan kosong; jika terdapat lebih banyak medan daripada pembolehubah, Yang terakhir akan mengumpulkan semua yang tinggal..
Dan tentu saja, Semua ini digabungkan dengan pengalihan yang anda konfigurasikan exec: jika anda telah mengalihkan stdin ke fail, read Ia akan mengambil datanya dari sana dan bukannya papan kekunci. Fleksibiliti itu merupakan salah satu asas skrip shell yang direka bentuk dengan baik.
exec dalam Perl: perbezaan dengan sistem dan penggunaan lanjutan
Dalam Perl, konsep exec Ia sangat selaras dengan tingkah laku dalam C dan dalam shell.Ini digunakan untuk menggantikan proses semasa dengan program lain. Walau bagaimanapun, Perl juga menawarkan systemyang sering dikelirukan dengan exec walaupun mereka tidak melakukan perkara yang sama.
Fungsi ini system Ia melancarkan arahan luaran dan menunggu sehingga selesai, mengembalikan kawalan kepada skrip.. Sebaliknya exec Ia menggantikan sepenuhnya proses Perl dengan program yang dipanggil dan tidak kembali ke skripkecuali sekiranya berlaku ralat. Satu contoh yang sangat asas ialah:
exec 'cat -n /etc/passwd';
die "no se pudo ejecutar cat: $!";
Si panggilan untuk exec Jika ia berjaya, ia tidak akan pernah dilaksanakan. diekerana penterjemah Perl akan digantikan dengan binari catJika ia gagal (contohnya, kerana ia tidak wujud) cat), maka ia dilaksanakan die memaparkan mesej ralat dan nilai $!.
Satu perincian yang sangat berguna ialah, sama seperti dengan system, anda boleh memanggil exec dengan senarai argumen untuk menghalang aksara meta shell daripada ditafsirkan. Sebagai contoh:
exec '/bin/echo', 'Los argumentos son: ', @ARGV;
Jika anda menjalankan skrip itu seperti ini:
./exec.pl 'uno' '| ls ' '| who > quien'
Anda akan melihatnya hujah-hujah yang merangkumi | atau pengalihan tidak mengaktifkan shelltetapi ia dipindahkan sebagaimana adanya kepada /bin/echoOutputnya akan menjadi seperti ini:
Los argumentos son: uno | ls | who > quien
Maksud saya, tiada arahan yang sebenarnya telah dilaksanakan, hanya teks sahaja yang telah ditunjukkan.
Gunakan exec dalam Perl untuk menyediakan persekitaran runtime
Selain contoh-contoh mudah, Perl sesuai untuk membina skrip yang menyediakan persekitaran kerja dengan canggih sebelum menjalankan program lainSatu kes biasa ialah apabila anda akan melancarkan tugasan pada mesin jauh melalui SSH dan anda ingin mencipta semula konteks tertentu bagi proses tempatan.
Satu pendekatan yang biasa dilakukan adalah dengan mempunyai subrutin yang membina skrip sementara secara dinamik dan kemudian melaksanakannyaDalam skrip itu, anda boleh menetapkan direktori kerja, pembolehubah persekitaran atau tingkah laku isyarat, dan akhirnya gunakan system o exec bergantung sama ada kita mahu kembali kepada pembungkusan atau tidak.
Contohnya, ia boleh disimpan di dalam rantai berbilang talian satu program kecil yang:
- Tukar ke direktori asal dari mana skrip utama digunakan.
- Pulihkan pembolehubah persekitaran daripada senarai bersiri.
- Laksanakan arahan sebenar dengan
system, menyemak status keluarnya. - Padam skrip sementara dan berakhir secara eksplisit dengan
exit(0).
Sebelum menyimpan program tersebut ke dalam fail sementara, Penanda teks digantikan (direktori, arahan untuk melaksanakan, nama skrip, dll.) dengan nilai sebenar mereka. Dengan teknik ini, anda boleh merangkum semua logik penyediaan persekitaran dan mempunyai satu titik masuk yang hanya "membungkus" sebarang pelaksanaan jauh.
Penyelesaian jenis ini memanfaatkan sepenuhnya Keupayaan Perl untuk memanipulasi rentetan, fail dan prosesdan ia sangat sesuai dengan fungsinya exec y system apabila tingkah laku yang sangat spesifik diperlukan dalam sistem teragih.
Modul Shell Perl dan panggilan arahan tersirat
Satu lagi aspek pelik yang berkaitan dengan Pelaksanaan arahan luaran dalam Perl ialah modul ShellModul ini membolehkan anda memanggil program sistem seolah-olah ia adalah fungsi Perl, hasil daripada penggunaan AUTOLOAD.
Bayangkan anda memuatkan modul seperti ini:
use Shell qw(echo cat ps cp);
Dari saat itu, apabila anda menulis sesuatu seperti:
$foo = echo("howdy", "funny", "world");
Apa yang berlaku di bawahnya ialah Perl tidak dapat menemui subrutin yang dipanggil echo dan pucuk AUTOLOAD del moduloMekanisme ini:
- Kenal pasti nama arahan bermula daripada nama penuh subrutin (
Shell::echo). - Bina fungsi sebenar secara dinamik yang akan melaksanakan arahan sistem tersebut.
- Majukan panggilan ke ciri baharu, menyampaikan hujah-hujah yang diterima.
Jika anda memeriksa pelaksanaan dengan penyahpepijat Perl, anda akan melihat bagaimana Hujah-hujah tersebut disusun menjadi @_ dan arahan yang akan dilancarkan dibina.Hasil daripada berlari echo Ia dikumpulkan dan disimpan di $foo, supaya:
print $foo;
Ia akan menunjukkan sesuatu yang bergaya howdy funny world dengan format yang dihasilkannya echo SistemPendekatan ini mudah, tetapi ia tidak boleh digunakan secara berlebihan kerana ia boleh menyukarkan pembacaan kod dan pengendalian ralat.
Perintah exec dalam shell sebagai alat pengalihan lanjutan
Seperti yang telah kita lihat, perintah itu exec Dalam cangkerang, ia bukan sahaja digunakan untuk menggantikan cangkerang.Sebaliknya, ia kerap digunakan untuk membuka, menutup atau menduplikasi deskriptor fail. Keupayaan ini membolehkan penciptaan corak yang sangat berkuasa dalam skrip.
Contohnya, anda mungkin mahu mengalihkan output keseluruhan skrip secara kekal ke fail log tanpa perlu >>log.txt pada setiap baris. Sesuatu seperti:
exec >/var/log/mi_script.log 2>&1
Dengan ini, Kedua-dua output standard dan output ralat akan pergi ke fail yang sama Dari permulaan skrip. Mulai saat itu, sebarang arahan yang gagal akan meninggalkan jejak dalam log tanpa mengganggu terminal.
Dalam kes lain, anda mungkin berminat dengan kaitkan deskriptor khusus dengan fail sementara untuk menyimpan data yang akan anda proses kemudian. Dengan menutup deskriptor tersebut dengan exec n>&-Anda membebaskan sumber dan mencegah kebocoran pengendali.
Memang benar bahawa jenis binaan ini tidak dilihat dalam skrip asas, tetapi Apabila anda mula menulis, utiliti pentadbiran yang serius menjadi hampir tidak boleh dilepaskan. untuk mengawal dengan betul apa yang dipaparkan pada skrin, apa yang disimpan dan bagaimana maklumat distrukturkan.
Pendek kata, untuk menguasai exec sebagai alat pengalihan lanjutan memberi anda tahap kawalan ke atas I/O skrip shell yang membezakan antara skrip "buatan sendiri" dan alat pengeluaran yang mantap.
Pada akhir keseluruhan perjalanan ini, idea utamanya ialah exec, sama ada dalam C, shell atau Perl, sentiasa berkisar pada dua paksi: menggantikan program yang sedang berjalan dan mengurus input dan output dengan tepat.Memahami bagaimana mereka bergabung dengan fork(), system, read atau modul seperti Shell Ia membolehkan anda mereka bentuk penyelesaian yang lebih bersih, lebih cekap dan lebih selamat, sama ada untuk melancarkan proses jarak jauh, merangkum persekitaran pelaksanaan yang kompleks atau hanya menulis skrip yang melakukan apa yang anda mahukan, tanpa kejutan.
Penulis yang bersemangat tentang dunia bait dan teknologi secara umum. Saya suka berkongsi pengetahuan saya melalui penulisan, dan itulah yang akan saya lakukan dalam blog ini, menunjukkan kepada anda semua perkara yang paling menarik tentang alat, perisian, perkakasan, trend teknologi dan banyak lagi. Matlamat saya adalah untuk membantu anda mengemudi dunia digital dengan cara yang mudah dan menghiburkan.
