Anda harus menggunakan _exit (atau sinonimnya _Exit ) untuk membatalkan program anak ketika exec gagal, karena dalam situasi ini, proses anak dapat mengganggu data eksternal (file) proses induk dengan memanggil atexit penangan, memanggil penangan sinyalnya, dan/atau membilas buffer.
Untuk alasan yang sama, Anda juga harus menggunakan _exit dalam setiap proses anak yang tidak melakukan exec , tetapi itu jarang terjadi.
Dalam semua kasus lainnya, cukup gunakan exit . Seperti yang Anda catat sendiri, setiap proses di Unix/Linux (kecuali satu, init ) adalah turunan dari proses lain, jadi gunakan _exit dalam setiap proses anak berarti exit tidak berguna di luar init .
switch (fork()) {
case 0:
// we're the child
execlp("some", "program", NULL);
_exit(1); // <-- HERE
case -1:
// error, no fork done ...
default:
// we're the parent ...
}
exit() membersihkan buffer io dan melakukan beberapa hal lain seperti menjalankan fungsi yang didaftarkan oleh atexit() . exit() memanggil _end( )
_exit() hanya mengakhiri proses tanpa melakukan itu. Anda memanggil _exit() dari proses induk saat membuat daemon misalnya.
Pernah perhatikan bahwa main() adalah fungsi? Pernah bertanya-tanya apa yang menyebutnya sejak awal? Ketika program c menjalankan shell yang Anda jalankan menyediakan jalur yang dapat dieksekusi ke panggilan sistem 'exec' dan kontrol diteruskan ke kernel yang pada gilirannya memanggil fungsi startup dari setiap _start() , panggil main() Anda , saat main() mengembalikannya lalu memanggil _end() Beberapa implementasi C menggunakan nama yang sedikit berbeda untuk _end() &_start() ...
exit() dan _exit() aktifkan _end()
Biasanya - untuk setiap main() harus ada satu &hanya satu exit() panggilan. (atau kembali di akhir main() )
exit() ada di atas _exit(), menggunakan pustaka C konvensional.
Ada perbedaannya:
-
_exit() tidak akan menghapus buffer stdio sementara exit() menghapus buffer stdio sebelum keluar.
-
_exit() tidak dapat melakukan proses pembersihan sementara exit() dapat didaftarkan dengan beberapa fungsi (yaitu on_exit atau at_exit) untuk melakukan beberapa proses pembersihan jika ada yang diperlukan sebelum ada program.
exit(status) cukup meneruskan status keluar ke _exit(status). Direkomendasikan kapan pun untuk melakukan fork(), salah satunya antara anak dan orang tua, satu menggunakan _exit() dan yang lain menggunakan exit().