fork () dan bagaimana sinyal dikirim ke proses

13

Saya memprogram yang saya tulis di C fork () dari proses anak. Tidak ada proses yang akan berakhir. Jika saya meluncurkan program dari baris perintah dan tekan control-c proses mana yang akan menerima sinyal interupsi?

Neil Locketz
sumber

Jawaban:

20

Mengapa kita tidak mencobanya dan melihatnya? Berikut ini adalah program sepele yang digunakan signal(3)untuk menjebak SIGINTproses orang tua dan anak dan mencetak pesan yang mengidentifikasi proses tersebut ketika tiba.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
    if (!fork()) {
        signal(SIGINT, &child_trap);
        sleep(1000);
        exit(0);
    }
    signal(SIGINT, &parent_trap);
    sleep(1000);
    return 0;
}

Sebut saja itu test.c. Sekarang kita bisa menjalankannya:

$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!

Sinyal interupsi yang dihasilkan di terminal dikirim ke grup proses aktif, yang di sini mencakup orang tua dan anak . Anda dapat melihat keduanya child_trapdan parent_trapdieksekusi ketika saya menekan Ctrl- C.

Ada diskusi panjang tentang interaksi antara forkdan sinyal dalam POSIX . Bagian yang paling material di sini adalah:

Sinyal yang dikirim ke grup proses setelah fork () harus dikirim ke orang tua dan anak.

Mereka juga mencatat bahwa beberapa sistem mungkin tidak berperilaku dengan cara yang benar, khususnya ketika sinyal datang sangat dekat dengan waktu fork(). Mencari tahu apakah Anda menggunakan salah satu dari sistem itu mungkin akan memerlukan membaca kode atau banyak keberuntungan, karena interaksi yang semakin tidak mungkin dalam setiap upaya individu.

Poin berguna lainnya adalah:

  • Sebuah sinyal yang dihasilkan secara manual dan dikirim ke proses individu (mungkin dengan kill) akan dikirimkan hanya untuk proses itu, terlepas dari apakah itu adalah orang tua atau anak.
  • Urutan bahwa penangan sinyal berjalan di antara proses tidak ditentukan, sehingga Anda tidak dapat mengandalkan kedua eksekusi terlebih dahulu.
  • Jika Anda tidak mendefinisikan interrupt handler (atau mengabaikan sinyal secara eksplisit), kedua proses hanya akan keluar dengan SIGINTkode (perilaku default).
  • Jika satu menangani sinyal non-fatal dan yang lainnya tidak, yang tanpa pawang akan mati dan yang lain akan melanjutkan.
Michael Homer
sumber
Saya menganggap kerang juga dapat mengganggu dengan cara yang menarik? Jika itu adalah sinyal bahwa mereka dapat menjebak, mungkin mengirimnya ke anak-anaknya? (Dan kemudian ada SIGHUP) (Semua ini mungkin berarti bahwa sementara OS tidak mengirim sinyal, proses anak mungkin tidak terpengaruh oleh sinyal ke orang tua ...)
Gert van den Berg