Pengenalan | Apabila proses tamat atau tamat di pertengahan jalan, kernel perlu melepaskan sumber sistem yang diduduki oleh proses tersebut. Ini termasuk fail yang dibuka semasa proses berjalan, memori diminta, dsb. |
Keluar daripada proses di bawah Linux dibahagikan kepada dua jenis: keluar biasa dan keluar tidak normal:
1.Keluar seperti biasa
a. Laksanakan pulangan dalam fungsi utama().
b. Panggil fungsi exit()
c. Panggil fungsi _exit()
2.Keluar secara tidak normal
a. Hubungi tentang fungsi
b. Proses menerima isyarat, dan isyarat menyebabkan program ditamatkan.
Tidak kira kaedah keluar yang digunakan, sistem akhirnya akan melaksanakan kod yang sama dalam kernel. Kod ini digunakan untuk menutup deskriptor fail terbuka yang digunakan oleh proses dan melepaskan memori dan sumber lain yang didudukinya.
Perbandingan beberapa kaedah keluar1 Perbezaan antara keluar dan balik:
keluar ialah fungsi dengan parameter. Selepas keluar dilaksanakan, kawalan diserahkan kepada sistem
return ialah pulangan selepas fungsi dilaksanakan. Selepas pemulangan dilaksanakan, kawalan diserahkan kepada fungsi panggilan.
2 Perbezaan antara keluar dan menggugurkan kandungan:
keluar adalah penamatan biasa proses
tentang adalah penamatan tidak normal.
fungsi exit() dan _exit()Fungsi keluar dan _keluar kedua-duanya digunakan untuk menamatkan proses. Apabila program melaksanakan exit atau _exit, sistem tanpa syarat menghentikan semua operasi yang tinggal, mengosongkan pelbagai struktur data dan menamatkan perjalanan proses.
keluar diisytiharkan dalam fail pengepala stdlib.h, manakala _exit() diisytiharkan dalam fail pengepala unistd.h. Parameter exit_code dalam exit ialah 0, yang bermaksud bahawa proses itu ditamatkan secara normal Jika nilai lain, ini bermakna ralat berlaku semasa pelaksanaan program.
Perbezaan antara exit() dan _exit()_exit() kembali ke kernel serta-merta selepas pelaksanaan, manakala exit() mula-mula melakukan beberapa operasi pembersihan dan kemudian menyerahkan kawalan kepada kernel.
Apabila fungsi _exit dipanggil, ia akan menutup semua deskriptor fail proses, membersihkan memori dan beberapa fungsi pembersihan kernel lain, tetapi tidak akan menyegarkan aliran (stdin, stdout, stderr...). antara fungsi _exit Pembalut pada _exit yang memanggil _exit dan mengepam strim sebelum memanggilnya.
Perbezaan terbesar antara fungsi exit() dan fungsi _exit() ialah fungsi exit() menyemak status terbuka fail dan menulis kandungan penimbal fail kembali ke fail sebelum memanggil sistem keluar. Oleh kerana terdapat operasi yang dipanggil "I/O buffered" dalam perpustakaan fungsi standard Linux, cirinya ialah terdapat penimbal dalam memori yang sepadan dengan setiap fail yang terbuka. Setiap kali fail dibaca, beberapa rekod akan dibaca secara berterusan, supaya pada kali berikutnya fail dibaca, ia boleh dibaca terus dari penimbal memori sama, setiap kali fail ditulis, ia hanya ditulis ke memori penimbal. Apabila syarat tertentu dipenuhi (seperti mencapai nombor tertentu atau menemui aksara tertentu, dsb.), kandungan dalam penimbal ditulis pada fail sekaligus. Teknologi ini sangat meningkatkan kelajuan membaca dan menulis fail, tetapi ia juga membawa sedikit masalah kepada pengaturcaraan. Sebagai contoh, terdapat beberapa data yang dianggap telah ditulis ke fail Sebenarnya, kerana ia tidak memenuhi syarat tertentu, ia hanya disimpan dalam penimbal Pada masa ini, gunakan fungsi _exit() untuk menutup terus proses, dan data dalam penimbal akan hilang. Oleh itu, jika anda ingin memastikan integriti data, anda mesti menggunakan fungsi exit().
Mari kita lihat perbezaan antara mereka melalui contoh fungsi:
Fungsi contoh 1: exit.c
#include #include int main() { printf("using exit----\n"); printf("This is the content in buffer\n"); exit(0); }
Hasil pelaksanaan ialah:
using exit---- This is the content in buffer
Contoh fungsi 2: _exit.c
#include #include int main() { printf("using _exit--\n"); printf("This is the content in buffer"); _exit(0); }
Hasil pelaksanaan ialah:
using _exit--
Fungsi printf menggunakan buffer I/O Fungsi ini membaca rekod secara automatik daripada penimbal apabila menemui aksara baris baharu "n". Oleh itu, exit() keluar selepas menulis data dalam buffer, manakala fungsi _exit() keluar terus.
Anda juga boleh menukar printf("Ini ialah kandungan dalam penimbal"); dalam contoh fungsi 2 kepada printf("Ini ialah kandungan dalam penimbal") (iaitu, tambah n di penghujung printf untuk melihat apa hasilnya adalah. Mengapa ini berlaku?
Urutan penamatan proses ibu bapa dan anak yang berbeza akan menghasilkan hasil yang berbeza 1. Proses ibu bapa tamat sebelum proses anak:Situasi ini adalah proses anak yatim yang kami gunakan sebelum ini. Apabila proses induk keluar dahulu, sistem akan membiarkan proses init mengambil alih proses anak.
2 Proses anak ditamatkan sebelum proses ibu bapa, dan proses ibu bapa tidak memanggil fungsi tunggu
Dalam kes ini, proses kanak-kanak memasuki keadaan zombi dan akan kekal sedemikian sehingga sistem dimulakan semula. Apabila proses anak berada dalam keadaan zombi, kernel hanya menyimpan beberapa maklumat yang diperlukan tentang proses yang diperlukan oleh proses induk. Pada masa ini, proses kanak-kanak sentiasa menduduki sumber, dan ia juga mengurangkan bilangan maksimum proses yang boleh dibuat oleh sistem.
Apakah keadaan zombi?
Proses yang telah ditamatkan tetapi proses induknya belum lagi menangani kesannya (mendapatkan maklumat tentang proses anak yang ditamatkan dan melepaskan sumber yang masih didudukinya) dipanggil proses zombi.
3 Proses anak ditamatkan sebelum proses ibu bapa, dan proses ibu bapa memanggil fungsi tunggu
Pada masa ini, proses ibu bapa akan menunggu sehingga proses anak tamat.
Atas ialah kandungan terperinci Metodologi: Fahami kaedah keluar proses Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!