C
Özet - IPC
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);.
Örnek çözümü göster
#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;
}
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.
Kendini test et
-
Hangi IPC aracı senkronizasyon için tasarlanmıştır?
- pipe
- FIFO
- message queue
- semaphore
Cevabı göster
semaphore — Semafor senkronizasyon için tasarlanmıştır.
-
IPC araçlarını eşle
- pipe
- Akraba tek yön
- FIFO
- Adlandırılmış kanal
- shm
- Ortak bellek
- semaphore
- Senkronizasyon
Sıradaki ders: flock