C'de Boru Sistemi Çağrısı

Pipe System Call C



boru() bir Linux sistem işlevidir. NS boru() system işlevi, farklı Linux süreçleri arasında iletişim kurmak için kullanılan dosya tanımlayıcılarını açmak için kullanılır. Kısacası, boru() işlevi, Linux'ta süreçler arası iletişim için kullanılır. Bu yazıda size Linux'ta pipe() sistem fonksiyonunun nasıl kullanılacağını göstereceğim. Öyleyse başlayalım.

sözdizimi boru() işlev:







intboru(intboru fd[2]);

Burada pipe() işlevi, süreçler arası iletişim için tek yönlü bir veri kanalı oluşturur. içinde geçersin int (Tamsayı) tür dizisi boru fd pipe() işlevine 2 dizi öğesinden oluşur. Ardından pipe() işlevi, dosyada iki dosya tanımlayıcısı oluşturur. boru fd dizi.



İlk unsur boru fd dizi, boru fd[0] borudan veri okumak için kullanılır.



İkinci unsur, boru fd dizi, boru fd[1] boruya veri yazmak için kullanılır.





Başarılı olduğunda, pipe() işlevi 0 döndürür. Boru başlatma sırasında bir hata oluşursa, pipe() işlevi -1 döndürür.

pipe() işlevi başlıkta tanımlanır unistd.h . C programınızda pipe() işlevini kullanmak için, başlığı eklemelisiniz. unistd.h aşağıdaki gibi:



#Dahil etmek

pipe() sistem işlevi hakkında daha fazla bilgi için, aşağıdaki komutla pipe()'nin man sayfasını kontrol edin:

$ adam2boru
Borunun adam sayfası().

Örnek 1:

İlk örnek için yeni bir C kaynak dosyası oluşturun 1_pipe.c ve aşağıdaki kod satırlarını yazın.

#Dahil etmek
#Dahil etmek
#Dahil etmek

intana(geçersiz) {
intborular[2];

Eğer(boru(borular) == -1) {
hata ('boru');
çıkış (EXIT_FAILURE);
}

baskı ('Dosya Tanımlayıcı Değerini Oku: %d ',borular[0]);
baskı ('Dosya Tanımlayıcı Değerini Yaz: %d ',borular[1]);

dönüşEXIT_SUCCESS;
}

Buraya pipe() başlık dosyasını ekledim unistd.h ilk aşağıdaki satırla.

#Dahil etmek

Daha sonra, içinde ana() fonksiyonu tanımladım borular aşağıdaki satıra sahip iki elemanlı tamsayı dizisi.

intborular[2];

Ardından, dosya tanımlayıcı dizisini başlatmak için pipe() işlevini çalıştırdım. borular aşağıdaki gibi.

boru(borular)

Ayrıca pipe() işlevinin dönüş değerini kullanarak hataları kontrol ettim. ben kullandım çıkış() boru işlevinin başarısız olması durumunda programı sonlandırma işlevi.

Eğer(boru(borular) == -1) {
hata ('boru');
çıkış (EXIT_FAILURE);
}

Ardından, okuma ve yazma boru dosyası tanımlayıcılarının değerini yazdırdım. borular[0] ve pipefds[1] sırasıyla.

baskı ('Dosya Tanımlayıcı Değerini Oku: %d ',borular[0]);
baskı ('Dosya Tanımlayıcı Değerini Yaz: %d ',borular[1]);

Programı çalıştırırsanız aşağıdaki çıktıyı görmelisiniz. Gördüğünüz gibi, okuma kanalı dosya tanımlayıcısının değeri borular[0] NS 3 ve boru dosya tanımlayıcısını yazın pipefds[1] NS 4 .

Örnek 2:

Başka bir C kaynak dosyası oluşturun 2_pipe.c ve aşağıdaki kod satırlarını yazın.

#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek

intana(geçersiz) {
intborular[2];
karaktertampon[5];

Eğer(boru(borular) == -1) {
hata ('boru');
çıkış (EXIT_FAILURE);
}

karakter *toplu iğne= '4128 0';

baskı ('Boruya PIN yazılıyor... ');
yazı yazmak(borular[1],toplu iğne, 5);
baskı ('Tamamlandı. ');

baskı ('Borudan PIN okunuyor... ');
okuman(borular[0],tampon, 5);
baskı ('Tamamlandı. ');

baskı (Borudan gelen PIN: %s ',tampon);

dönüşEXIT_SUCCESS;
}

Bu program temel olarak size boruya nasıl yazı yazacağınızı ve borudan yazdığınız verileri nasıl okuyacağınızı gösterir.

Burada 4 karakterli bir PIN kodunu bir karakter dizi. Dizinin uzunluğu 5'tir (NULL karakteri dahil).

karakter *toplu iğne= '4128 0';

Her ASCII karakteri C'de 1 bayt boyutundadır. Bu nedenle, 4 haneli PIN'i borudan göndermek için boruya 5 bayt (4 + 1 BOŞ karakter) veri yazmanız gerekir.

5 bayt veri yazmak için ( toplu iğne ) borunun içine, kullandım yazı yazmak() yazma kanalı dosya tanımlayıcısını kullanan işlev pipefds[1] aşağıdaki gibi.

yazı yazmak(borular[1],toplu iğne, 5);

Artık boruda bazı verilerim olduğuna göre, bunu kullanarak borudan okuyabilirim. okuman() okuma kanalı dosya tanımlayıcısında işlev borular[0] . 5 bayt veri yazdığım gibi ( toplu iğne ) boruya, borudan da 5 bayt veri okuyacağım. Okunan veriler, tampon karakter dizisi. Borudan 5 bayt veri okuyacağım için, tampon karakter dizisi en az 5 bayt uzunluğunda olmalıdır.

tanımladım tampon başındaki karakter dizisi ana() işlev.

karaktertampon[5];

Artık borudan PIN'i okuyabilir ve tampon aşağıdaki satıra sahip dizi.

okuman(borular[0],tampon, 5);

Artık borudan PIN'i okuduğuma göre, bunu kullanarak yazdırabilirim. yazdır() her zamanki gibi işlev görür.

baskı (Borudan gelen PIN: %s ',tampon);

Programı çalıştırdığımda, gördüğünüz gibi doğru çıktı görüntüleniyor.

Örnek 3:

Yeni bir C kaynak dosyası oluşturun 3_pipe.c aşağıdaki kod satırlarını yazın.

#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
intana(geçersiz) {
intborular[2];
karakter *toplu iğne;
karaktertampon[5];

Eğer(boru(borular) == -1) {
hata ('boru');
çıkış (EXIT_FAILURE);
}

pid_t pid=çatal();

Eğer(pid== 0) { // alt süreçte
toplu iğne= '4821 0'; // Gönderilecek PIN
kapat(borular[0]); // okuma fd'yi kapat
yazı yazmak(borular[1],toplu iğne, 5); // boruya PIN yaz

baskı ('Çocukta PIN oluşturuluyor ve ebeveyne gönderiliyor... ');
uyku(2); // kasıtlı gecikme
çıkış (EXIT_SUCCESS);
}

Eğer(pid> 0) { // ana işlemde
Bekle(BOŞ); // alt işlemin bitmesini bekleyin
kapat(borular[1]); // fd yazmayı kapat
okuman(borular[0],tampon, 5); // borudan PIN oku
kapat(borular[0]); // okuma fd'yi kapat

baskı ('Ebeveyn '%s' PIN'ini aldı ',tampon);
}

dönüşEXIT_SUCCESS;
}

Bu örnekte, süreçler arası iletişim için borunun nasıl kullanılacağını gösterdim. Bir boru kullanarak alt süreçten üst sürece bir PIN gönderdim. Ardından ana süreçteki borudan PIN'i okuyun ve ana süreçten yazdırın.

Öncelikle fork() fonksiyonunu kullanarak bir alt süreç oluşturdum.

pid_t pid=çatal();

Ardından, alt süreçte ( pid == 0 ), PIN'i kullanarak boruya yazdım yazı yazmak() işlev.

yazı yazmak(borular[1],toplu iğne, 5);

PIN, alt süreçten boruya yazıldığında, ana süreç ( sayı > 0 ) kullanarak borudan okuyun okuman() işlev.

okuman(borular[0],tampon, 5);

Ardından, ana işlem PIN'i kullanarak yazdırdı. yazdır() her zamanki gibi işlev görür.

baskı ('Ebeveyn '%s' PIN'ini aldı ',tampon);

Gördüğünüz gibi programı çalıştırmak beklenen sonucu veriyor.

Örnek 4:

Yeni bir C kaynak dosyası oluşturun 4_pipe.c aşağıdaki kod satırlarını yazın.

#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

geçersizalPIN(karaktertoplu iğne[PIN_LENGTH+ 1]) {
srand (getpid() +getppid());

toplu iğne[0] = 49 + sıra () % 7;

için(intben= 1;ben<PIN_LENGTH;ben++) {
toplu iğne[ben] = 48 + sıra () % 7;
}

toplu iğne[PIN_LENGTH] = ' 0';
}


intana(geçersiz) {
süre(1) {
intborular[2];
karaktertoplu iğne[PIN_LENGTH+ 1];
karaktertampon[PIN_LENGTH+ 1];

boru(borular);

pid_t pid=çatal();

Eğer(pid== 0) {
alPIN(toplu iğne); // PIN oluştur
kapat(borular[0]); // okuma fd'yi kapat
yazı yazmak(borular[1],toplu iğne,PIN_LENGTH+ 1); // boruya PIN yaz

baskı ('Çocukta PIN oluşturuluyor ve ebeveyne gönderiliyor... ');

uyku(PIN_WAIT_INTERVAL); // PIN oluşturmayı kasıtlı olarak geciktirmek.

çıkış (EXIT_SUCCESS);
}

Eğer(pid> 0) {
Bekle(BOŞ); // çocuğun bitirmesi bekleniyor

kapat(borular[1]); // fd yazmayı kapat
okuman(borular[0],tampon,PIN_LENGTH+ 1); // borudan PIN oku
kapat(borular[0]); // okuma fd'yi kapat
baskı ('Ebeveyn, çocuktan '%s' PIN'i aldı. ',tampon);
}
}

dönüşEXIT_SUCCESS;
}

Bu örnek aynı Örnek 3 . Tek fark, bu programın sürekli olarak bir alt süreç oluşturması, alt süreçte bir PIN oluşturması ve PIN'i bir boru kullanarak üst sürece göndermesidir.

Ana süreç daha sonra borudan PIN'i okur ve yazdırır.

Bu program her PIN_WAIT_INTERVAL saniyede yeni bir PIN_LENGTH PIN oluşturur.

Gördüğünüz gibi, program beklendiği gibi çalışıyor.

Programı sadece tuşuna basarak durdurabilirsiniz. + C .

C programlama dilinde pipe() sistem çağrısını bu şekilde kullanırsınız. Bu makaleyi okuduğunuz için teşekkürler.