GNU/Linux >> Belajar Linux >  >> Linux

Apa perbedaan antara menggunakan _exit() &exit() di Linux fork-exec konvensional?

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:

  1. _exit() tidak akan menghapus buffer stdio sementara exit() menghapus buffer stdio sebelum keluar.

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


Linux
  1. Apa perbedaan antara wadah Linux dan gambar?

  2. Apa perbedaan antara perintah locate dan find di Linux?

  3. Apa perbedaan antara env dan set (di Mac OS X atau Linux)?

  1. Apa perbedaan antara buffer dan memori cache di Linux?

  2. Apa perbedaan antara driver platform Linux dan driver perangkat biasa?

  3. Apa perbedaan antara 'temukan' dan 'temukan' di Linux?

  1. Linux vs. Unix:Apa bedanya?

  2. Apa perbedaan antara ls dan l?

  3. Apa perbedaan antara halaman manual 'hier(7)' dan 'file-hierarchy(7)'?