Boru, süreçler arasında iletişim için bir ortamdır. Bir işlem boruya veri yazar ve başka bir işlem borudan verileri okur. Bu yazıda, kavramı C dilini kullanarak uygulamak için pipe() işlevinin nasıl kullanıldığını göreceğiz.
Boru Hakkında
Boruda, veriler bir FIFO düzeninde tutulur; bu, borunun bir ucuna sırayla veri yazma ve borunun diğer ucundan verileri aynı sırayla okuma anlamına gelir.
Borudan herhangi bir işlem okursa, ancak kanala henüz başka bir işlem yazmadıysa, read dosyanın sonunu döndürür. Bir proses bir boruya yazmak istiyorsa ancak okuma için boruya eklenmiş başka bir proses yoksa, bu bir hata durumudur ve boru bir SIGPIPE sinyali üretir.
Başlık dosyası
#Dahil etmekSözdizimi
int boru (int dosyalar[2])Argümanlar
Bu işlev tek bir argüman alır, iki tam sayıdan oluşan bir dizi (dosya). dosya[0] borudan okumak için kullanılır ve dosyalar[1] boruya yazmak için kullanılır. Borudan okumak isteyen işlem kapatılmalıdır dosyalar[1], ve boruya yazmak isteyen işlem kapanmalı dosya[0]. Borunun gereksiz uçları açıkça kapatılmazsa, dosya sonu (EOF) asla döndürülmez.
Dönüş değerleri
Başarı üzerine, boru() 0 döndürür, başarısızlık durumunda işlev -1 döndürür.
Resimsel olarak, temsil edebiliriz boru() aşağıdaki gibi işlev:
Aşağıda boru işlevinin C dilinde nasıl kullanılacağını gösteren birkaç örnek verilmiştir.
Örnek 1
Bu örnekte boru fonksiyonunun nasıl çalıştığını göreceğiz. Bir boruyu tek bir işlemde kullanmak pek kullanışlı olmasa da bir fikir edineceğiz.
// Örnek 1.c#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
int ana()
int n;
int dosya[2];
karakter arabelleği[1025];
char *mesaj = "Merhaba, Dünya!";
boru(filedes);
write(filedes[1], mesaj, strlen(mesaj));
if ((n = read ( filees[0], buffer, 1024 ) ) >= 0)
arabellek[n] = 0; // dizeyi sonlandır
printf("borudan %d bayt oku: "%s"\n", n, tampon);
Başka
pererror("oku");
çıkış (0);
Burada ilk önce kullanarak bir boru oluşturduk boru() işlev daha sonra kullanılarak boruya yazılır dosyalar[1] son. Daha sonra veriler, borunun diğer ucu kullanılarak okunmuştur dosya[0]. Dosyayı okumak ve yazmak için eskiden oku() ve yazmak() fonksiyonlar.
Örnek2
Bu örnekte, üst ve alt süreçlerin boru kullanarak nasıl iletişim kurduğunu göreceğiz.
// Örnek2.c#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
int ana()
int dosya sayısı[2], nbayt;
pid_t çocukpid;
char string[] = "Merhaba dünya!\n";
karakter okuma arabelleği[80];
boru(filedes);
if((childpid = çatal()) == -1)
pererror("çatal");
çıkış(1);
if(childpid == 0)
close(filedes[0]);//Alt süreç borunun bu ucuna ihtiyaç duymaz
/* "string"i borunun çıkış tarafından gönder */
write(filedes[1], string, (strlen(string)+1));
çıkış (0);
Başka
/* Üst süreç borunun çıkış tarafını kapatır */
close(filedes[1]);//Üst işlemin borunun bu ucuna ihtiyacı yok
/* Borudan bir dizi oku */
nbytes = read(filedes[0], readbuffer, sizeof(readbuffer));
printf("Dizeyi oku: %s", readbuffer);
dönüş(0);
İlk olarak, boru işlevi kullanılarak bir boru oluşturuldu, ardından bir alt süreç çatallandı. Ardından, alt süreç okuma ucunu kapatır ve boruya yazar. Ana süreç, yazma ucunu kapatır ve borudan okur ve onu görüntüler. Burada veri akışı, çocuktan ebeveyne giden tek yoldur.
Sonuç:
boru() Linux'ta güçlü bir sistem çağrısıdır. Bu yazıda sadece tek yönlü veri akışını gördük, bir proses yazıyor ve diğer proses okuyor, iki boru oluşturarak çift yönlü veri akışını da elde edebiliyoruz.