Dalam dua bab pertama, kami belajar tentang mencipta proses Dalam bab ini, kami akan belajar cara menamatkan proses di bawah Linux.
Di Linux, terdapat 3 cara untuk menamatkan proses secara normal dan 2 cara untuk menamatkan secara tidak normal:
1. Akhir biasa:
a. Panggilan kembali dalam fungsi utama. Ini bersamaan dengan memanggil keluar.
b. Panggil fungsi keluar Mengikut definisi fungsi ini dalam ANSIC, apabila dipanggil, semua pemegang keluar yang didaftarkan akan dilaksanakan, semua aliran I/O standard akan dimatikan, dan deskriptor fail dan pelbagai proses (proses induk) tidak akan diproses (dengan proses kanak-kanak), pekerjaan, dsb., jadi ia tidak sesuai untuk sistem Linux.
c. Panggil fungsi _exit. Keluar dipanggil latihan linux oleh _exit dan menutup beberapa pemegang keluar khusus linux.
2. Penamatan tidak normal
a. Ini nampaknya merupakan kes istimewa bagi kes kedua, kerana ia membentuk isyarat SIGABRT.
b. Proses menerima isyarat tertentu Isyarat ini boleh dihasilkan oleh proses itu sendiri (seperti fungsi abort), atau ia boleh datang dari proses lain atau kernel. Sebagai contoh: apabila proses cuba mengakses alamat memori di luar sempadan atau apabila pembahagi adalah sifar, kernel akan menjana isyarat untuk mengganggu proses.
Tidak kira kaedah yang digunakan untuk menamatkan proses, sekeping kod yang sama dalam kernel akhirnya akan dilaksanakan. Kod ini menutup semua deskriptor fail yang dibuka oleh proses, memori video yang diduduki oleh akses peribadi, dsb.
Mari kita lihat pada fungsi exit dan _exit
Dua fungsi ini terdapat dalam fail pengepala yang berbeza: exit dalam stdlib.h, _exit dalam unistd.h
Kaedah panggilan khusus mereka adalah seperti berikut:
voidexit(int__status)
void_exit(int__status)
Parameter status ialah status keluar.
Mari kita lihat dua keping kod berikut:
Gambar 1
Gambar 2
Gambar 3
Gambar 4
Kod dalam Rajah 1 kekurangan n, menyebabkan ayat pada akhir ujian tidak disalin Ini kerana jika printf tidak menambah n, maklumat tidak akan disalin serta-merta, dan _keluar tidak akan memaksa output. data dalam penimbal , iaitu data yang belum ditulis ke peranti dan masih dalam penimbal yang disebabkan oleh panggilan seperti printf/fprintf akan dibuang semasa _exit . Jika ada n, salin terus Pada masa ini, tiada beza antara keluar/_keluar
Urutan yang berbeza di mana proses abang dan kakak ditamatkan akan menghasilkan hasil yang berbeza
1. Proses ibu bapa tamat sebelum proses anak:
Keadaan ini yang kita panggil proses yatim piatu. 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, sub-proses memasuki keadaan zombi dan akan kekal sedemikian sehingga sistem dimulakan semula. Apabila proses anak berada dalam keadaan zombie Di bawah Linux, ia keluar tanpa menyimpan Kernel hanya menyimpan beberapa maklumat yang diperlukan untuk proses induk. Pada masa ini, proses kanak-kanak masih menduduki sumber, dan ia juga mengurangkan bilangan maksimum proses yang boleh dibuat oleh sistem.
Apakah keadaan zombi?
Satu proses yang telah ditamatkan lama dahulu, tetapi proses induknya belum lagi menangani kesannya (mendapatkan maklumat tentang proses anak yang ditamatkan dan melepaskan sumber yang masih didudukinya) dipanggil proses zombi (zombie).
3 Proses anak ditamatkan sebelum proses indukKeluar tanpa menyimpan di bawah Linux, tetapi proses induk memanggil fungsi tunggu
Pada masa ini, proses ibu bapa akan menunggu sehingga proses anak tamat.
Atas ialah kandungan terperinci Cara menamatkan proses di bawah Linux: Penjelasan terperinci tentang penamatan biasa dan tidak normal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!