GNU/Linux >> Belajar Linux >  >> Linux

Apa Penyebab Berbagai Sinyal Terkirim?

Terkadang saya sedikit bingung dengan semua sinyal yang dapat diterima oleh suatu proses. Seperti yang saya pahami, sebuah proses memiliki penangan default (disposisi sinyal ) untuk setiap sinyal ini, tetapi ia dapat menyediakan pengendalinya sendiri dengan memanggil sigaction() .

Jadi inilah pertanyaan saya:apa yang menyebabkan setiap sinyal dikirim? Saya menyadari bahwa Anda dapat mengirim sinyal secara manual ke proses yang sedang berjalan melalui -s parameter ke kill , tapi apa yang alami keadaan di mana sinyal-sinyal ini dikirim? Misalnya, kapan SIGINT dikirim?

Juga, apakah ada batasan sinyal mana yang dapat ditangani? Bahkan bisa SIGSEGV sinyal diproses dan kontrol dikembalikan ke aplikasi?

Jawaban yang Diterima:

Selain proses yang memanggil kill(2) , beberapa sinyal dikirim oleh kernel (atau terkadang oleh proses itu sendiri) dalam berbagai keadaan:

  • Driver terminal mengirim sinyal yang sesuai dengan berbagai peristiwa:
    • Pemberitahuan tekan tombol:SIGINT (silakan kembali ke loop utama) di Ctrl +C , SIGQUIT (harap segera keluar) di Ctrl + , SIGTSTP (mohon ditangguhkan) pada Ctrl +Z . Kunci dapat diubah dengan stty perintah.
    • SIGTTIN dan SIGTTOU dikirim saat proses latar belakang mencoba membaca atau menulis ke terminal pengontrolnya.
    • SIGWINCH dikirim untuk memberi sinyal bahwa ukuran jendela terminal telah berubah.
    • SIGHUP dikirim untuk memberi sinyal bahwa terminal telah hilang (secara historis karena modem Anda h ung naik , saat ini biasanya karena Anda telah menutup jendela emulator terminal).
  • Beberapa jebakan prosesor dapat menghasilkan sinyal. Detailnya bergantung pada arsitektur dan sistem; berikut adalah contoh tipikal:
    • SIGBUS untuk memori akses yang tidak selaras;
    • SIGSEGV untuk akses ke halaman yang belum dipetakan;
    • SIGILL untuk instruksi ilegal (opcode buruk);
    • SIGFPE untuk instruksi floating-point dengan argumen yang buruk (mis. sqrt(-1) ).
  • Sejumlah sinyal memberi tahu proses target bahwa beberapa peristiwa sistem telah terjadi:
    • SIGALRM memberitahukan bahwa pengatur waktu yang disetel oleh proses telah kedaluwarsa. Timer dapat disetel dengan alarm , setitimer dan lainnya.
    • SIGCHLD memberi tahu sebuah proses bahwa salah satu anaknya telah meninggal.
    • SIGPIPE dihasilkan ketika sebuah proses mencoba menulis ke pipa ketika akhir pembacaan telah ditutup (idenya adalah jika Anda menjalankan foo | bar dan bar keluar, foo terbunuh oleh SIGPIPE ).
    • SIGPOLL (juga disebut SIGIO ) memberi tahu proses bahwa peristiwa yang dapat disurvei telah terjadi. POSIX menentukan peristiwa yang dapat disurvei yang terdaftar melalui I_SETSIG ioctl . Banyak sistem mengizinkan kejadian yang dapat disurvei pada deskriptor file apa pun, yang disetel melalui O_ASYNC fcntl bendera. Sinyal terkait adalah SIGURG , yang memberitahukan data penting pada perangkat (terdaftar melalui I_SETSIG ioctl ) atau soket.
    • Pada beberapa sistem, SIGPWR dikirim ke semua proses saat UPS memberi sinyal bahwa listrik akan mati.
Terkait:Linux – Union mount di Linux?

Daftar ini tidak lengkap. Sinyal standar didefinisikan dalam signal.h .

Sebagian besar sinyal dapat ditangkap dan ditangani (atau diabaikan) oleh aplikasi. Satu-satunya dua sinyal portabel yang tidak dapat ditangkap adalah SIGKILL (mati saja) dan STOP (hentikan eksekusi).

SIGSEGV (kesalahan segmentasi) dan sepupunya SIGBUS (kesalahan bus) dapat ditangkap, tetapi itu adalah ide yang buruk kecuali Anda benar-benar tahu apa yang Anda lakukan. Aplikasi umum untuk menangkapnya adalah mencetak jejak tumpukan atau informasi debug lainnya. Aplikasi yang lebih canggih adalah untuk mengimplementasikan beberapa jenis manajemen memori dalam proses, atau untuk menjebak instruksi yang buruk di mesin mesin virtual.

Akhirnya, izinkan saya menyebutkan sesuatu yang bukan merupakan sinyal. Saat Anda menekan Ctrl +D di awal baris dalam program yang membaca input dari terminal, ini memberi tahu program bahwa akhir file input telah tercapai. Ini bukan sinyal:ini ditransmisikan melalui API input/output. Sukai Ctrl +C dan teman-teman, kuncinya dapat dikonfigurasi dengan stty .


Linux
  1. Apa Penyebab File Kehilangan Izin?

  2. Bagaimana Cara Memeriksa Sinyal Apa yang Didengarkan oleh Proses?

  3. Dasar-Dasar Sinyal Linux – Bagian I

  1. Proses Apa yang Membuat Jendela X11 Ini?

  2. Proses apa yang menggunakan semua IO disk saya

  3. Apa yang terjadi ketika sebuah benang bercabang?

  1. Apa yang dimaksud dengan "Pemimpin sesi" di `ps`?

  2. Apa definisi sesi di linux?

  3. Apa perintah untuk menemukan prioritas proses di Linux?