"Enter"a basıp içeriğe geçin

C’de işlem hattı sistem çağrısı – Linux ipucu

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

sözdizimi pompa() İşlev:

int pompa(int boru fd[2]);

Burada, pipe() işlevi, süreçler arası iletişim için tek yönlü bir veri kanalı oluşturur. Geçmek int (tamsayı) Bir dizi tür boru fd pipe() işlevinin iki dizi öğesinden oluşur. pipe() işlevi daha sonra dosyada iki dosya tanıtıcısı oluşturur. boru fd bir dizi.

ilk öğe boru fd bir dizi, boru fd[0] Borudan veri okumak için kullanılır.

ikinci eleman boru fd bir 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ığı eklemeniz gerekir. unistd.h aşağıdaki gibi:

pipe() işlevi hakkında daha fazla bilgi için, aşağıdaki komutla pipe() kılavuz sayfasına bakın:

Adem 2 pompa
Sayfa Boru Adamı().

Örnek 1:

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

#birleştirmek için
#birleştirmek için
#birleştirmek için

int o(Geçersiz){
int tüpler[2];

eğer(pompa(tüpler)==1){
a kadar(“pompa”);
çıkış(EXIT_FAILURE);
}

Baskı(Dosya tanımlayıcı değerini oku: %d\nVe tüpler[0]);
Baskı(Dosya tanımlayıcı değerini yaz: %d\nVe tüpler[1]);

dönüş ÇIKIŞ_BAŞARI;
}

Buraya bir boru başlık dosyası () ekledim. unistd.h Aşağıdaki ilk satır ile.

daha sonra O.O() işi seçtin tüpler Aşağıdaki satıra sahip iki bileşenli bir tamsayı dizisi.

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

Ayrıca, pipe() işlevinin dönüş değerini kullanarak hataları da kontrol ettim. Kullanılmış Çıkış() Kanal işlevi arızası durumunda programı sonlandırmak için işlev.

eğer(pompa(tüpler)==1){
a kadar(“pompa”);
çıkış(EXIT_FAILURE);
}

Sonra okuma ve yazma dosya tanımlayıcılarının değerini yazdırırım. tüpler[0] e boru[1] sırasıyla.

Baskı(Dosya tanımlayıcı değerini oku: %d\nVe tüpler[0]);
Baskı(Dosya tanımlayıcı değerini yaz: %d\nVe tüpler[1]);

Programı çalıştırırsanız aşağıdaki çıktıyı görmelisiniz. Gördüğünüz gibi kanal dosya tanıtıcı değeri okunuyor. tüpler[0] problemler 3 Boru dosyası tanımlayıcısını yazın boru[1] problemler 4.

İkinci örnek:

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

#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için

int o(Geçersiz){
int tüpler[2];
Mektup tampon[5];

eğer(pompa(tüpler)==1){
a kadar(“pompa”);
çıkış(EXIT_FAILURE);
}

Mektup*toplu iğne =4128\0;

Baskı(“Pimi tüpün üzerine yaz…\n);
yazmak(tüpler[1]Ve toplu iğneVe5);
Baskı(“tamamlamak.\n\n);

Baskı(“Pimi tüpten okumak…\n);
Okuman(tüpler[0]Ve tamponVe5);
Baskı(“tamamlamak.\n\n);

Baskı(Borudan PIN: %s\nVe tampon);

dönüş ÇIKIŞ_BAŞARI;
}

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

Bu, 4 karakterli bir PIN’dir. Mektup bir dizi. Dizinin uzunluğu 5’tir (NULL \0 karakteri dahil).

Mektup*toplu iğne =4128\0;

C’de her ASCII karakteri 1 bayttır. Bu nedenle, boru yoluyla 4 basamaklı bir PIN göndermek için, boruya 5 bayt (4 + 1 boş karakter) veri yazmanız gerekir.

5 bayt veri yazmak için (toplu iğne) tüpte kullandım yazmak() Yazma kanalı dosya tanıtıcısını kullanarak çalışır boru[1] aşağıdaki gibi.

yazmak(tüpler[1]Ve toplu iğneVe5);

Artık boruda bazı verilerim olduğuna göre, bunu borudan okuyabilirim. okuman () Kanal dosyası tanımlayıcısını okuma işlevi tüpler[0]. 5 bayt veri yazdığım gibi (toplu iğne) boruya ve borudan 5 bayt veri okuyacağım. verileri oku, tampon Sicim. Borudan 5 bayt veri okuyacağım için, tampon Karakter dizisi en az 5 bayt uzunluğunda olmalıdır.

biliyordum tampon başındaki karakter dizisi O.O() İşlev.

Artık pimi tüpten okuyabilir ve tampon aşağıdaki satır ile dizi.

Okuman(tüpler[0]Ve tamponVe5);

Artık iğneyi tüpten okuduğuma göre, bununla yazdırabilirim. Yazdır() Her zamanki gibi çalışır.

Baskı(Borudan PIN: %s\nVe tampon);

Programı çalıştırdığımda gördüğünüz gibi doğru çıktı gösteriliyor.

Örnek 3:

Yeni bir C kaynak dosyası oluşturun 3_ Borular Aşağıdaki kod satırlarını yazın.

#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
int o(Geçersiz){
int tüpler[2];
Mektup*toplu iğne;
Mektup tampon[5];

eğer(pompa(tüpler)==1){
a kadar(“pompa”);
çıkış(EXIT_FAILURE);
}

pid_t pid = çatal();

eğer(pid ==0){// alt süreçte
toplu iğne =4821\0;// PIN gönderilecek
dördüncü(tüpler[0]);// fd’yi oku
yazmak(tüpler[1]Ve toplu iğneVe5);// PIN’i tüpe yazın

Baskı(Bir çocuğun PIN’ini oluşturun ve ebeveyne gönderin…\n);
uyumak(2);// kasıtlı gecikme
çıkış(ÇIKIŞ_BAŞARI);
}

eğer(pid >0){// ana süreçte
Bekle(boş);// Alt sürecin bitmesini bekleyin
dördüncü(tüpler[1]);// fd yazmayı bırak
Okuman(tüpler[0]Ve tamponVe5);// borudan pin oku
dördüncü(tüpler[0]);// fd’yi oku

Baskı(Ebeveyn bir PIN ‘%s’ aldı\nVe tampon);
}

dönüş ÇIKIŞ_BAŞARI;
}

Bu örnekte size prosesler arası iletişim için pipe kullanmayı gösterdim. Bir boru kullanarak alt süreçten üst sürece bir PIN gönderdiniz. Daha sonra ana işlemde borudan pimi okuyun ve ana işlemden yazdırın.

İlk olarak, fork() işlevini kullanarak bir alt süreç oluşturdum.

Sonra alt süreçte (ürün kimliği == 0), iğneyi tüpe şunu kullanarak yazdınız: yazmak() İşlev.

yazmak(tüpler[1]Ve toplu iğneVe5);

Pin, alt süreçten boruya yazıldığında, üst süreç (say > 0) kullanarak tüpten okuyun okuman () İşlev.

Okuman(tüpler[0]Ve tamponVe5);

Ardından ana işlem bunu PIN ile yazdırır. Yazdır() Her zamanki gibi çalışır.

Baskı(Ebeveyn bir PIN ‘%s’ aldı\nVe tampon);

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

Örnek 4:

Yeni bir C kaynak dosyası oluşturun 4_ Borular Aşağıdaki kod satırlarını yazın.

#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

Geçersiz Alpler(Mektup toplu iğne[PIN_LENGTH +1]){
Sarand(abartılı()+ saçmalık());

toplu iğne[0]=49+Koştu()%7;

için(int Kahve =1; Kahve < PIN_LENGTH; Kahve++){
toplu iğne[ben]=48+Koştu()%7;
}

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

int o(Geçersiz){
Süre(1){
int tüpler[2];
Mektup toplu iğne[PIN_LENGTH +1];
Mektup tampon[PIN_LENGTH +1];

pompa(tüpler);

pid_t pid = çatal();

eğer(pid ==0){
Alpler(toplu iğne);// PIN oluştur
dördüncü(tüpler[0]);// fd’yi oku
yazmak(tüpler[1]Ve toplu iğneVe PIN_LENGTH +1);// PIN’i tüpe yazın

Baskı(Bir çocuğun PIN’ini oluşturun ve ebeveyne gönderin…\n);

uyumak(PIN_WAIT_INTERVAL);// PIN’in oluşturulmasını kasıtlı olarak geciktirin.

çıkış(ÇIKIŞ_BAŞARI);
}

eğer(pid >0){
Bekle(boş);// çocuğun bitirmesini bekle

dördüncü(tüpler[1]);// fd yazmayı bırak
Okuman(tüpler[0]Ve tamponVe PIN_LENGTH +1);// borudan pin oku
dördüncü(tüpler[0]);// fd’yi oku
Baskı(Ebeveyn, çocuktan ‘%s’ PIN’ini aldı.\n\nVe tampon);
}
}

dönüş ÇIKIŞ_BAŞARI;
}

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 ana sürece göndermesidir.

Daha sonra ana işlem, pimi tüpten okur ve yazdırır.

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

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

Programı sadece düğmeye 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.

Diğer gönderilerimize göz at

[wpcin-random-posts]

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir