GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana SIGINT berhubungan dengan sinyal terminasi lainnya seperti SIGTERM, SIGQUIT dan SIGKILL?

SIGTERM dan SIGKILL dimaksudkan untuk tujuan umum permintaan "hentikan proses ini". SIGTERM (secara default) dan SIGKILL (selalu) akan menyebabkan penghentian proses. SIGTERM mungkin tertangkap oleh proses (misalnya sehingga dapat melakukan pembersihan sendiri jika diinginkan), atau bahkan diabaikan sama sekali; tetapi SIGKILL tidak dapat ditangkap atau diabaikan.

SIGINT dan SIGQUIT dimaksudkan khusus untuk permintaan dari terminal:karakter input tertentu dapat ditetapkan untuk menghasilkan sinyal ini (tergantung pada pengaturan kontrol terminal). Tindakan default untuk SIGINT adalah jenis penghentian proses yang sama dengan tindakan default untuk SIGTERM dan tindakan yang tidak dapat diubah untuk SIGKILL; tindakan default untuk SIGQUIT juga merupakan penghentian proses, tetapi tindakan tambahan yang ditentukan implementasi dapat terjadi, seperti pembuatan core dump. Keduanya dapat ditangkap atau diabaikan oleh proses jika diperlukan.

SIGHUP, seperti yang Anda katakan, dimaksudkan untuk menunjukkan bahwa koneksi terminal telah terputus, daripada menjadi sinyal terminasi seperti itu. Namun, sekali lagi, tindakan default untuk SIGHUP (jika proses tidak menangkap atau mengabaikannya) adalah menghentikan proses dengan cara yang sama seperti SIGTERM dll.

Ada tabel dalam definisi POSIX untuk signal.h yang mencantumkan berbagai sinyal serta tindakan dan tujuan defaultnya, dan bab Antarmuka Terminal Umum mencakup lebih banyak detail tentang sinyal terkait terminal.


Seperti yang dicatat oleh DarkDust, banyak sinyal memiliki hasil yang sama, tetapi proses dapat melampirkan tindakan berbeda padanya dengan membedakan bagaimana setiap sinyal dihasilkan. Melihat kode sumber kernel FreeBSD (kern_sig.c), saya melihat bahwa kedua sinyal ditangani dengan cara yang sama, keduanya menghentikan proses dan dikirim ke utas apa pun.

SA_KILL|SA_PROC,             /* SIGINT */
SA_KILL|SA_PROC,             /* SIGTERM */

man 7 signal

Ini adalah halaman manual non-normatif dari proyek halaman manual Linux yang sering ingin Anda lihat untuk informasi sinyal Linux.

Versi 3.22 menyebutkan hal-hal menarik seperti:

Sinyal SIGKILL dan SIGSTOP tidak dapat ditangkap, diblokir, atau diabaikan.

dan berisi tabel:

Signal     Value     Action   Comment
----------------------------------------------------------------------
SIGHUP        1       Term    Hangup detected on controlling terminal
                              or death of controlling process
SIGINT        2       Term    Interrupt from keyboard
SIGQUIT       3       Core    Quit from keyboard
SIGILL        4       Core    Illegal Instruction
SIGABRT       6       Core    Abort signal from abort(3)
SIGFPE        8       Core    Floating point exception
SIGKILL       9       Term    Kill signal
SIGSEGV      11       Core    Invalid memory reference
SIGPIPE      13       Term    Broken pipe: write to pipe with no
                              readers
SIGALRM      14       Term    Timer signal from alarm(2)
SIGTERM      15       Term    Termination signal
SIGUSR1   30,10,16    Term    User-defined signal 1
SIGUSR2   31,12,17    Term    User-defined signal 2
SIGCHLD   20,17,18    Ign     Child stopped or terminated
SIGCONT   19,18,25    Cont    Continue if stopped
SIGSTOP   17,19,23    Stop    Stop process
SIGTSTP   18,20,24    Stop    Stop typed at tty
SIGTTIN   21,21,26    Stop    tty input for background process
SIGTTOU   22,22,27    Stop    tty output for background process

yang merangkum sinyal Action yang membedakan misalnya SIGQUIT dari SIGQUIT, karena SIGQUIT memiliki aksi Core dan SIGINT Term .

Tindakan tersebut didokumentasikan dalam dokumen yang sama:

The entries in the "Action" column of the tables below specify the default disposition for each signal, as follows:

Term   Default action is to terminate the process.

Ign    Default action is to ignore the signal.
Core   Default action is to terminate the process and dump core (see core(5)).
Stop   Default action is to stop the process.
Cont   Default action is to continue the process if it is currently stopped.

Saya tidak dapat melihat perbedaan apa pun antara SIGTERM dan SIGINT dari sudut pandang kernel karena keduanya memiliki aksi Term dan keduanya dapat ditangkap. Tampaknya itu hanyalah "perbedaan konvensi penggunaan umum":

  • SIGINT adalah apa yang terjadi saat Anda melakukan CTRL-C dari terminal
  • SIGTERM adalah sinyal default yang dikirim oleh kill

Beberapa sinyal adalah ANSI C dan lainnya tidak

Perbedaan yang cukup besar adalah:

  • SIGINT dan SIGTERM adalah ANSI C, jadi lebih portabel
  • SIGQUIT dan SIGKILL bukan

Mereka dijelaskan pada bagian "7.14 Penanganan sinyal " dari C99 draft N1256:

  • SIGINT menerima sinyal perhatian interaktif
  • SIGTERM permintaan penghentian dikirim ke program

yang menjadikan SIGINT kandidat yang baik untuk Ctrl + C interaktif.

POSIX 7

POSIX 7 mendokumentasikan sinyal dengan signal.h tajuk:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html

Halaman ini juga memiliki tabel minat berikut yang menyebutkan beberapa hal yang telah kita lihat di man 7 signal :

Signal    Default Action   Description
SIGABRT   A                Process abort signal.
SIGALRM   T                Alarm clock.
SIGBUS    A                Access to an undefined portion of a memory object.
SIGCHLD   I                Child process terminated, stopped,
SIGCONT   C                Continue executing, if stopped.
SIGFPE    A                Erroneous arithmetic operation.
SIGHUP    T                Hangup.
SIGILL    A                Illegal instruction.
SIGINT    T                Terminal interrupt signal.
SIGKILL   T                Kill (cannot be caught or ignored).
SIGPIPE   T                Write on a pipe with no one to read it.
SIGQUIT   A                Terminal quit signal.
SIGSEGV   A                Invalid memory reference.
SIGSTOP   S                Stop executing (cannot be caught or ignored).
SIGTERM   T                Termination signal.
SIGTSTP   S                Terminal stop signal.
SIGTTIN   S                Background process attempting read.
SIGTTOU   S                Background process attempting write.
SIGUSR1   T                User-defined signal 1.
SIGUSR2   T                User-defined signal 2.
SIGTRAP   A                Trace/breakpoint trap.
SIGURG    I                High bandwidth data is available at a socket.
SIGXCPU   A                CPU time limit exceeded.
SIGXFSZ   A                File size limit exceeded.

init BusyBox

1.29.2 bawaan BusyBox reboot perintah mengirim SIGTERM ke proses, tidur sebentar, lalu mengirim SIGKILL. Ini tampaknya menjadi konvensi umum di berbagai distro.

Saat Anda mematikan sistem BusyBox dengan:

reboot

itu mengirimkan sinyal ke proses init.

Kemudian, penangan sinyal init akhirnya memanggil:

static void run_shutdown_and_kill_processes(void)
{
    /* Run everything to be run at "shutdown".  This is done _prior_
     * to killing everything, in case people wish to use scripts to
     * shut things down gracefully... */
    run_actions(SHUTDOWN);

    message(L_CONSOLE | L_LOG, "The system is going down NOW!");

    /* Send signals to every process _except_ pid 1 */
    kill(-1, SIGTERM);
    message(L_CONSOLE, "Sent SIG%s to all processes", "TERM");
    sync();
    sleep(1);

    kill(-1, SIGKILL);
    message(L_CONSOLE, "Sent SIG%s to all processes", "KILL");
    sync();
    /*sleep(1); - callers take care about making a pause */
}

yang mencetak ke terminal:

The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes

Berikut adalah contoh konkret minimalnya.

Sinyal yang dikirim oleh kernel

  • SIGKILL:
    • Pembunuh OOM:Apa itu RSS dan VSZ dalam manajemen memori Linux

Linux
  1. Sinyal Linux – Contoh Program C untuk Menangkap Sinyal (SIGINT, SIGKILL, SIGSTOP, dll.)

  2. Bagaimana menemukan Proses Yang Membunuh mysqld Dengan SIGKILL atau SIGTERM di Linux

  3. Bagaimana saya bisa menentukan ukuran ARC saat ini di ZFS, dan bagaimana hubungan ARC dengan memori kosong atau cache?

  1. Tujuan .bashrc Dan Bagaimana Cara Kerjanya?

  2. Linux – Bagaimana Kernel Linux Mengetahui Nomor Mayor dan Minor Perangkat?

  3. Bagaimana systemd menangani kematian anak dari proses yang dikelola?

  1. Bagaimana Cara Kerja Sticky Bit?

  2. Linux – Bagaimana Pembunuh Oom Memutuskan Proses Mana Yang Harus Dibunuh Pertama?

  3. Linux – Bisakah Ctrl+c Mengirim Sinyal Tanda Ke Beberapa Proses?