C dilinde boru işlevi nasıl kullanılır

How Use Pipe Function C Language



Boru, süreçler arasındaki 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.







Kanaldan 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 etmek

Sözdizimi



intboru(intdosya[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.

// Örnek1.c
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek

intana()
{
intn;
intdosya[2];
karaktertampon[1025];
karakter *İleti= 'Selam Dünya!';

boru(dosya);
yazı yazmak(dosya[1],İleti, strlen (İleti));

Eğer ((n=okuman(dosya[0],tampon, 1024 ) ) > = 0) {
tampon[n] = 0; // dizeyi sonlandır
baskı ('borudan %d bayt oku:'%s' ',n,tampon);
}
Başka
hata ('okuman');
çıkış (0);
}

Burada ilk önce kullanarak bir boru oluşturduk. boru() işlev daha sonra kullanılarak boruya yazılır fildişi [1] son. Daha sonra veriler, borunun diğer ucu kullanılarak okunmuştur. dosya[0] . Dosyayı okumak ve yazmak için eskiden okuman() ve yazı 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

intana()
{
intdosya[2],nbayt;
pid_t çocuk kimliği;
karaktersicim[] = 'Selam Dünya! ';
karakterokuma arabelleği[80];

boru(dosya);

Eğer((çocuksu=çatal()) == -1)
{
hata ('çatal');
çıkış (1);
}

Eğer(çocuksu== 0)
{
kapat(dosya[0]);//Alt süreç borunun bu ucuna ihtiyaç duymaz

/* 'string'i borunun çıkış tarafından gönder */
yazı yazmak(dosya[1],sicim, ( strlen (sicim)+1));
çıkış (0);
}
Başka
{
/* Üst süreç borunun çıkış tarafını kapatır */
kapat(dosya[1]);//Üst süreç borunun bu ucuna ihtiyaç duymaz

/* Borudan bir dizi oku */
nbayt=okuman(dosya[0],okuma arabelleği, boyutu(okuma arabelleği));
baskı ('Dizeyi oku: %s',okuma arabelleği);
}

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 işlem yazma ucunu kapatır ve borudan okur ve görüntüler. Burada veri akışı, çocuktan ebeveyne olan tek yoldur.

Çözüm:

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.