CodeBlanks Logo Icon CodeBlanks

Özet - IPC

  • C kursu
  • İleri seviye
  • Ders 36/83
  • 5 dk

pipe, shared memory ve semaforu birleştirerek bir IPC uygulaması yazarsın.

IPC özeti

Beş IPC aracını öğrendin: pipe akraba süreçlere tek yön, FIFO herhangi iki sürece adlandırılmış kanal, shared memory en hızlı ortak bellek, message queue tiplenmiş mesajlar, semaphore senkronizasyon.

Çoğu gerçek uygulamada bunları birleştirirsin: shared memory ile veriyi paylaşır, semaphore ile erişimi sıralarsın; pipe veya FIFO ile küçük bildirimler taşırsın. Bu özette shared memory ve semaphore ile sayacı artırıp pipe ile sonucu geri alacağız.

Uygulama IPC birleştirme

int fds[2]; pipe(fds); ile kanal kur. int shmid = shmget(IPC_PRIVATE, 64, 0600 | IPC_CREAT); ve int semid = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT); ile segment ve semafor kur. int *shared = (int *)shmat(shmid, NULL, 0); *shared = 0; ve semctl(semid, 0, SETVAL, 0);. pid_t pid = fork(); ile çocuk oluştur. Çocukta close(fds[0]); struct sembuf op = {0, -1, 0}; semop(semid, &op, 1); int v = *shared; write(fds[1], &v, sizeof(int)); close(fds[1]); _exit(0);. Ebeveynde close(fds[1]); *shared = 7; struct sembuf op = {0, 1, 0}; semop(semid, &op, 1); int got = 0; read(fds[0], &got, sizeof(int)); printf("ipc: %d\n", got);. Temizlik: close(fds[0]); wait(NULL); shmdt(shared); shmctl(shmid, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID);.

Başlangıç kodu

main.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
#include <sys/wait.h>

// pipe, shared memory ve semafor kur
// fork ile çocuk bekleyip pipe'a yazsın
// ebeveyn değeri yazıp sinyal verip pipe'tan okusun

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void) {
    int fds[2];
    pipe(fds);
    int shmid = shmget(IPC_PRIVATE, 64, 0600 | IPC_CREAT);
    int semid = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT);
    int *shared = (int *)shmat(shmid, NULL, 0);
    *shared = 0;
    semctl(semid, 0, SETVAL, 0);
    pid_t pid = fork();
    if (pid == 0) {
        close(fds[0]);
        struct sembuf op = {0, -1, 0};
        semop(semid, &op, 1);
        int v = *shared;
        write(fds[1], &v, sizeof(int));
        close(fds[1]);
        _exit(0);
    }
    close(fds[1]);
    *shared = 7;
    struct sembuf op = {0, 1, 0};
    semop(semid, &op, 1);
    int got = 0;
    read(fds[0], &got, sizeof(int));
    printf("ipc: %d\n", got);
    close(fds[0]);
    wait(NULL);
    shmdt(shared);
    shmctl(shmid, IPC_RMID, NULL);
    semctl(semid, 0, IPC_RMID);
    return 0;
}

Beklenen çıktı

ipc: 7

Sonraki adımlar

IPC araç setini tamamladın. Bu temeller veritabanı sunucularının, mesaj kuyruğu sistemlerinin ve mikroservis iletişiminin çekirdeğidir. Modern sistemlerde aynı makinede shared memory ve semafor yaygındır; ağlar için ise socket kullanılır.

Sonraki konular: dosya kilitleme ile veri bütünlüğü, terminal I/O ile etkileşimli uygulamalar, dinamik yükleme ile eklenti sistemleri ve kriptografi ile güvenlik. Bunların hepsi IPC'nin üzerine inşa edilebilir.

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hangi IPC aracı senkronizasyon için tasarlanmıştır?

  • pipe
  • FIFO
  • message queue
  • semaphore Doğru cevap

Açıklama: Semafor senkronizasyon için tasarlanmıştır.

2 IPC araçlarını eşle

Kavram Anlamı
pipe Akraba tek yön
FIFO Adlandırılmış kanal
shm Ortak bellek
semaphore Senkronizasyon

İleri seviye bölümündeki tüm dersler