GNU/Linux >> Belajar Linux >  >> Linux

Bisakah exit() gagal menghentikan proses?

Ya, ada beberapa keadaan, seperti:

Fungsi exit() pertama-tama akan memanggil semua fungsi yang didaftarkan oleh atexit(), dalam urutan terbalik dari pendaftarannya, kecuali bahwa suatu fungsi dipanggil setelah fungsi terdaftar sebelumnya yang telah dipanggil pada saat didaftarkan. Setiap fungsi dipanggil sebanyak yang didaftarkan. Jika, selama panggilan ke fungsi tersebut, panggilan ke fungsi longjmp() dibuat yang akan mengakhiri panggilan ke fungsi terdaftar, perilaku tidak ditentukan.

Jika sebuah fungsi yang didaftarkan oleh panggilan ke atexit() gagal dikembalikan, fungsi terdaftar yang tersisa tidak akan dipanggil dan pemrosesan exit() lainnya tidak akan selesai. Jika exit() dipanggil lebih dari sekali, perilaku tidak ditentukan.

Lihat halaman POSIX saat keluar.

Untuk informasi selengkapnya, lampirkan debugger saat Anda mencapai situasi tersebut dan lihat tumpukan panggilan.


Apakah Anda menelepon exit() dari pengendali sinyal?

Di man 7 signal , bagian Async-signal-safe functions Anda dapat melihat semua fungsi yang dijamin berfungsi saat dipanggil dari penangan sinyal:

Fungsi penangan sinyal harus sangat berhati-hati, karena pemrosesan di tempat lain dapat terganggu di beberapa titik tertentu dalam eksekusi program. POSIX memiliki konsep "fungsi aman". Jika sinyal menyela eksekusi fungsi yang tidak aman, dan penangan memanggil fungsi yang tidak aman, maka perilaku program tidak ditentukan.

POSIX.1-2004 (juga dikenal sebagai POSIX.1-2001 Technical Corrigendum 2) memerlukan implementasi untuk menjamin bahwa fungsi berikut dapat dipanggil dengan aman di dalam penangan sinyal:

Di sana Anda dapat melihat fungsi _Exit() , _exit() dan abort() , tetapi terutama bukan exit() . Jadi, Anda sebaiknya tidak memanggilnya dari penangan sinyal.

Hal buruknya adalah meskipun Anda memanggil fungsi yang tidak aman dari penangan sinyal (printf() ada?) itu hanya akan bekerja sebagian besar waktu... tetapi tidak selalu.


Linux
  1. Kode Keluar Default Saat Proses Dihentikan?

  2. Bagaimana Memanggil Fungsi Bash Dalam Skrip Bash Di Dalam Awk?

  3. Cara Membuat dan Memanggil Fungsi di Bash

  1. Proses UNIX / Linux:C fork() Fungsi

  2. Cara Memanggil Fungsi C di C++, Fungsi C++ di C (Campuran C dan C++)

  3. Bagaimana proses mencegat stdout dan stderr dari proses lain di Linux?

  1. Memanggil fungsi C dari kode C++

  2. Bagaimana pustaka bersama (.so) memanggil fungsi yang diimplementasikan dalam program pemuatannya?

  3. Tidak dapat memanggil fungsi pustaka standar C pada Linux 64-bit dari kode rakitan (yasm).