Pipe
- C kursu
- İleri seviye
- Ders 31/83
- 5 dk
pipe ile süreçler arası tek yönlü veri akışını öğrenirsin.
Pipe nedir?
Pipe, akraba süreçler arasında tek yönlü veri akışı sağlayan anonim bir kanaldır. pipe(int fds[2]) çağrısı iki dosya tanıtıcı döndürür: fds[0] okuma, fds[1] yazma uçlarıdır.
Tipik desen şudur: önce pipe ile kanal oluşturulur, sonra fork ile çocuk süreç üretilir. Ebeveyn yazma üçünü, çocuk okuma üçünü kullanır; kullanmadıkları uçları close ile kapatırlar. Bu sayede write ve read ile veri akar. Pipe tamponlanmıştır; okuyucu bağlanana kadar write bekler.
fork ile pipe paylaşımı
fork çağrısı çocuğa ebeveynin tanıtıcı tablosunun bir kopyasını verir. Bu yüzden her iki süreç de aynı pipe uçlarına sahiptir. Kanalın tek yönlü kalması için ebeveyn okuma üçünü, çocuk yazma üçünü kapatır.
Ebeveyn write(fds[1], "merhaba", 7) ile yazar, çocuk read(fds[0], buf, 7) ile okur. read veri gelene kadar bekler; bu yüzden çıktı sıralaması garantilenir. İş bitince her iki taraf da kalan ucu kapatır; ebeveyn wait ile çocuğu toplar.
Uygulama Pipe ile mesaj gönder
int fds[2]; pipe(fds); ile kanal kur. pid_t pid = fork(); ile çocuk oluştur. Çocukta close(fds[1]);, char buf[16]; memset(buf, 0, sizeof(buf));, read(fds[0], buf, 7);, printf("%s\n", buf);, close(fds[0]); _exit(0);. Ebeveynde close(fds[0]);, write(fds[1], "merhaba", 7);, close(fds[1]);, wait(NULL);.
Başlangıç kodu
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
// pipe ile kanal kur
// fork ile çocuk oluştur, çocuk okusun
// ebeveyn yazsın ve wait ile beklesin
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(void) {
int fds[2];
pipe(fds);
pid_t pid = fork();
if (pid == 0) {
close(fds[1]);
char buf[16];
memset(buf, 0, sizeof(buf));
read(fds[0], buf, 7);
printf("%s\n", buf);
close(fds[0]);
_exit(0);
}
close(fds[0]);
write(fds[1], "merhaba", 7);
close(fds[1]);
wait(NULL);
return 0;
}Beklenen çıktı
merhaba
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 pipe(fds) çağrısından sonra fds[0] hangi amaçla kullanılır?
- Hata kodu
- Yazma ucu
- Okuma ucu Doğru cevap
- Süreç kimliği
Açıklama: fds[0] okuma, fds[1] yazma ucudur.
2 pipe çağrısı
int fds[2]; pipe(____);
int fds[2]; pipe(fds);
Açıklama: pipe, fds dizisinin adresini alır ve iki ucu doldurur.
3 Pipe parçalarını eşle
| Kavram | Anlamı |
|---|---|
pipe |
Kanal oluşturur |
fork |
Süreç ikiye bölünür |
fds[0] |
Okuma ucu |
fds[1] |
Yazma ucu |