fork () ve sinyallerin süreçlere nasıl iletildiği


13

C fork () 'a yazdığım bir programın alt sürecinden çıkıyorum. Her iki süreç de sona ermeyecektir. Programı komut satırından başlatır ve control-c tuşlarına basarsam hangi süreç (ler) kesme sinyalini alır?

Yanıtlar:


20

Neden denemiyor ve görmüyoruz? Hem üst hem de alt süreci signal(3)yakalamak SIGINTve geldiğinde süreci tanımlayan bir mesaj yazdırmak için kullanılan önemsiz bir program .

#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;
}

Diyelim ki test.c. Şimdi çalıştırabiliriz:

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

Terminalde üretilen kesme sinyalleri burada hem ebeveyn hem de alt öğeyi içeren aktif işlem grubuna iletilir . Her ikisini de görebilirsiniz child_trapve - parent_traptuşuna bastığımda idam edildi .CtrlC

Bir yoktur arasındaki etkileşimlerin uzun tartışma forkPOSIX'deki ve sinyaller . Burada en maddi kısmı şudur:

Çataldan () sonra işlem grubuna gönderilen bir sinyal hem ebeveyne hem de çocuğa iletilmelidir.

Ayrıca bazı sistemlerin özellikle sinyal zamanına çok yaklaştığında tam olarak doğru davranmayabileceğini de not ederler fork(). Bu sistemlerden birinde olup olmadığınızı anlamak, muhtemelen kodu veya çok fazla şansı okumayı gerektirecektir, çünkü etkileşimlerin her bir denemede kaybolması olası değildir.

Diğer faydalı noktalar:

  • Manuel olarak oluşturulan ve tek bir işleme (belki de ile kill) gönderilen bir sinyal , ana veya alt öğe olup olmadığına bakılmaksızın yalnızca bu işleme iletilir .
  • Sinyal işleyicilerin işlemler arasında çalıştığı sıra tanımlanmadığından, ilk önce iki yürütmeye de güvenemezsiniz.
  • Eğer varsa yok bir kesme işleyicisi define (veya açıkça sinyali görmezden), her iki işlem sadece ile çıkarsınız SIGINTkodu (varsayılan davranış).
  • Biri sinyali ölümcül olmayan bir şekilde ele alır ve diğeri yapmazsa, işleyicisi olmayan biri ölecek ve diğeri devam edecektir.

Mermilerin ilginç yollara da müdahale edebileceğini mi sanıyorum? Eğer tuzağa düşebilecekleri bir işaretse, çocuklarına gönderebilir mi? (Ve sonra SIGHUP var) (Tüm bunlar işletim sistemi sinyalleri göndermezken, bir alt sürecin ebeveyne bir sinyalden etkilenmeyebileceği anlamına gelebilir ...)
Gert van den Berg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.