0Pricing
C Academy · Pelajaran

Sinyal

Notifikasi asinkron.

Sinyal adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Apa Itu Sinyal

Sinyal adalah notifikasi asinkron yang dikirim ke proses untuk memberi tahu bahwa suatu peristiwa terjadi, misalnya pengguna menekan Ctrl-C atau proses anak berakhir. Sinyal merupakan bentuk IPC yang ringan.

Sinyal Umum

Beberapa sinyal yang akan sering Anda temui:

  • SIGINT interupsi (Ctrl-C)
  • SIGTERM permintaan penghentian yang sopan
  • SIGKILL penghentian paksa (tidak dapat ditangkap)
  • SIGCHLD proses anak mengubah status
  • SIGSEGV akses memori tidak valid

Tindakan Bawaan

Setiap sinyal memiliki tindakan bawaan: mengakhiri, mengakhiri dengan core dump, mengabaikan, menghentikan, atau melanjutkan. Anda dapat mengganti sebagian besar tindakan ini dengan handler.

Memasang Handler

Cara modern dan portabel untuk menetapkan handler adalah sigaction. Handler tersebut adalah fungsi yang menerima nomor sinyal.

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

Mengapa Bukan signal()

Fungsi lama signal() memiliki perilaku yang tidak konsisten di berbagai sistem (pengaturan ulang handler, tanpa kendali SA_RESTART). Sebaiknya gunakan sigaction, yang perilakunya terdefinisi dengan baik dan portabel.

Fungsi yang Aman terhadap Sinyal Asinkron

Handler dapat menyela kode Anda kapan saja, jadi handler hanya boleh memanggil fungsi yang aman terhadap sinyal asinkron seperti write. Memanggil printf atau malloc dari handler dapat menyebabkan kebuntuan atau kerusakan data.

Menggunakan Flag volatile

Pola yang aman: handler menetapkan flag volatile sig_atomic_t, lalu loop utama memeriksanya. Dengan begitu, handler tetap sangat sederhana dan aman.

#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(); } */

Mengirim Sinyal

Gunakan kill(pid, sig) untuk mengirim sinyal ke proses lain, atau raise(sig) untuk mengirim sinyal kepada diri sendiri. Meskipun namanya demikian, kill dapat mengirim sinyal apa pun, bukan hanya sinyal yang mematikan.

#include <signal.h>

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

Memblokir Sinyal

Untuk melindungi bagian kritis, blokir sinyal sementara dengan sigprocmask dan sekumpulan sinyal. Sinyal yang diblokir tetap berstatus menunggu dan akan dikirim setelah pemblokiran dibuka.

#include <signal.h>

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

Mengambil Kembali Proses Anak dengan SIGCHLD

Ketika proses anak berhenti, kernel mengirim SIGCHLD. Handler yang memanggil waitpid mengambil kembali proses anak tersebut, sehingga mencegah proses zombie yang tertinggal di tabel proses.

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

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

Sinyal yang Tidak Dapat Ditangkap

Dua sinyal bersifat mutlak: SIGKILL selalu mengakhiri proses dan SIGSTOP selalu menghentikan proses. Keduanya tidak dapat ditangkap, diblokir, atau diabaikan, sehingga sistem memiliki cara yang terjamin untuk mengendalikan proses.

Pemeriksaan Singkat

Uji pemahaman Anda tentang sinyal.

Rangkuman

Anda telah mempelajari sinyal untuk notifikasi asinkron.

  • Pasang handler dengan sigaction, bukan signal yang lama
  • Handler harus aman terhadap sinyal asinkron; sebaiknya cukup menetapkan flag
  • Kirim dengan kill/raise; blokir dengan sigprocmask
  • Ambil kembali proses anak saat menerima SIGCHLD; SIGKILL dan SIGSTOP tidak dapat ditangkap

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Sinyal” gratis?

Ya — teks lengkap “Sinyal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Sinyal”?

Notifikasi asinkron. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Sinyal” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pipe
  2. Memori Bersama
  3. Antrean Pesan
  4. Sinyal
← Kembali ke C Academy