C Academy · Ders

Sinyaller

Eşzamansız bildirimler

4. ders / 413 adım

Sinyaller, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

Sinyal Nedir

Sinyal, bir olayın gerçekleştiğini bildirmek için bir sürece gönderilen zaman uyumsuz bildirimdir; örneğin kullanıcının Ctrl-C'ye basması veya bir alt sürecin sonlanması gibi. Sinyaller, IPC'nin düşük maliyetli bir biçimidir.

Yaygın Sinyaller

Sıkça karşılaşacağınız birkaç sinyal:

  • SIGINT kesme (Ctrl-C)
  • SIGTERM nazik sonlandırma isteği
  • SIGKILL zorla sonlandırma (yakalanamaz)
  • SIGCHLD bir alt süreç durum değiştirdi
  • SIGSEGV geçersiz bellek erişimi

Varsayılan Davranışlar

Her sinyalin varsayılan bir eylemi vardır: sonlandırma, çekirdek dökümüyle sonlandırma, yok sayma, durdurma veya devam etme. Bunların çoğunu bir işleyiciyle geçersiz kılabilirsiniz.

İşleyici Yükleme

İşleyici ayarlamanın modern ve taşınabilir yolu sigaction kullanmaktır. İşleyici, sinyal numarasını alan bir işlevdir.

#include <signal.h>
#include <stdio.h>

void on_signal(int sig) {
    /* note: printf is not async-signal-safe; for demo only */
    write(1, "caught\n", 7);
}

int install(void) {
    struct sigaction sa = {0};
    sa.sa_handler = on_signal;
    return sigaction(SIGINT, &sa, NULL);
}

Neden signal() Değil

Eski signal() işlevinin sistemler arasındaki davranışı tutarsızdır (işleyicinin sıfırlanması, SA_RESTART denetiminin olmaması). İyi tanımlanmış ve taşınabilir olan sigaction işlevini tercih edin.

Eşzamansız Sinyal Güvenli İşlevler

Bir işleyici kodunuzu herhangi bir noktada kesintiye uğratabilir; bu nedenle yalnızca write gibi eşzamansız sinyal açısından güvenli işlevleri çağırabilir. Bir işleyiciden printf veya malloc çağırmak kilitlenmeye ya da bozulmaya yol açabilir.

volatile Bayrağı Kullanma

Güvenli bir kalıp şudur: işleyici bir volatile sig_atomic_t bayrağı ayarlar ve ana döngü bunu denetler. Böylece işleyici küçük ve güvenli tutulur.

#include <signal.h>

volatile sig_atomic_t stop = 0;

void handler(int sig) {
    stop = 1; /* only set a flag */
}
/* main loop: while (!stop) { do_work(); } */

Sinyal Gönderme

Başka bir sürece sinyal göndermek için kill(pid, sig), kendinize sinyal göndermek için raise(sig) kullanın. Adına rağmen kill yalnızca öldürücü sinyalleri değil, her türlü sinyali gönderir.

#include <signal.h>

int notify(int pid) {
    return kill(pid, SIGTERM); /* ask process to terminate */
}

Sinyalleri Engelleme

Kritik bir bölümü korumak için sinyalleri sigprocmask ve bir sinyal kümesiyle geçici olarak engelleyin. Engellenen sinyaller beklemede kalır ve engel kaldırıldığında teslim edilir.

#include <signal.h>

void block_int(void) {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, NULL);
}

SIGCHLD ile Alt Süreçleri Toplama

Bir alt süreç sonlandığında çekirdek SIGCHLD gönderir. waitpid çağıran bir işleyici alt süreci toplar ve süreç tablosunda kalan zombi süreçlerin oluşmasını önler.

#include <signal.h>
#include <sys/wait.h>

void reap(int sig) {
    while (waitpid(-1, NULL, WNOHANG) > 0)
        ; /* reap all finished children */
}

Yakalanamayan Sinyaller

İki sinyal kesindir: SIGKILL her zaman süreci sonlandırır ve SIGSTOP her zaman süreci durdurur. Bunlar yakalanamaz, engellenemez veya yok sayılamaz; böylece sistemin süreçleri denetlemesi için garantili bir yol sağlanır.

Hızlı Kontrol

Sinyalleri ne kadar anladığınızı test edin.

Özet

Eşzamansız bildirim için sinyalleri öğrendiniz.

  • İşleyicileri eski signal yerine sigaction ile yükleyin
  • İşleyiciler eşzamansız sinyal açısından güvenli olmalıdır; bir bayrak ayarlamayı tercih edin
  • kill/raise ile gönderin; sigprocmask ile engelleyin
  • SIGCHLD geldiğinde alt süreçleri toplayın; SIGKILL ve SIGSTOP yakalanamaz
Başlamak ücretsiz

Yapay zeka eğitmeniyle C öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
39
Dersler
144

Sıkça Sorulan Sorular

“Sinyaller” dersi ücretsiz mi?

Evet — “Sinyaller” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“Sinyaller” dersinde ne öğreneceğim?

Eşzamansız bildirimler C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Sinyaller” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Boru Hatları
  2. Paylaşılan Bellek
  3. İleti Kuyrukları
  4. Sinyaller
← C Academy Sayfasına Dön