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().