ホームページ > 記事 > システムチュートリアル > Linuxでのプロセスの終了方法:正常終了と異常終了を詳しく解説
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
写真3
写真4
図 1 のコードには n が欠落しているため、テストの最後の文がコピーされません。これは、printf が n を追加しない場合、情報がすぐにコピーされず、_exit が出力を強制しないためです。バッファ内のデータ、つまり、デバイスに書き込まれておらず、printf/fprintf などの呼び出しによってバッファ内に残っているデータは、_exit 中に破棄されますが、exit では破棄されません。 。 nがある場合は直接コピーしてください。この時、exit/_exitの違いはありません
。兄弟プロセスと姉妹プロセスの終了順序が異なると、異なる結果が生じます
1. 親プロセスは子プロセスの前に終了します:
この状況を孤立プロセスと呼びます。親プロセスが最初に終了すると、システムは init プロセスに子プロセスを引き継がせます。
2. 子プロセスが親プロセスより先に終了し、親プロセスが wait 関数を呼び出さない
この場合、サブプロセスはゾンビ状態になり、システムが再起動されるまでゾンビ状態のままになります。子プロセスがゾンビ状態になると、Linux では保存せずに終了します。カーネルは、親プロセスに必要なプロセスの一部の情報のみを保存します。現時点では、子プロセスはまだリソースを占有しているため、システムが作成できるプロセスの最大数も減ります。
ゾンビ状態とは何ですか?
ずっと前に終了しているが、その親プロセスがまだ余波に対処していない (終了した子プロセスに関する情報を取得し、まだ占有しているリソースを解放している) プロセスは、ゾンビ プロセス (ゾンビ) と呼ばれます。
3. 子プロセスは親プロセスより前に終了します Linux では保存せずに終了しますが、親プロセスは wait 関数を呼び出します
このとき、親プロセスは子プロセスが終了するのを待ちます。
以上がLinuxでのプロセスの終了方法:正常終了と異常終了を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。