C'de Linux Popen Sistem Çağrısı

C De Linux Popen Sistem Cagrisi



popen() işlevi, dize komutu tarafından verilen komutu yürütecektir. İşlev, çağıran uygulama ile yürütülen komut arasında bir kanal oluştururken, boruya okumak veya yazmak için kullanılan bir akışa bir işaretçi döndürmelidir. Popen işlevi, G/Ç işlevinin standart kitaplığında bulunur ve bir terminal komutunu çalıştırmak için ikinci bir işlem oluşturur. popen() işlevinin açık aşaması, fopen() işlevindeki açık aşaması ile aynıdır. popen() işlevi çatallayarak, bir boru oluşturarak ve kabuğu çalıştırarak bir işlemi başlatır. Bir boru varsayılan olarak tek yönlü olduğundan; sonuç olarak, akış ya salt okunurdur ya da salt okunurdur. popen() işlevinin başarılı yürütülmesinde, borunun okuması ve yazması için kullanılan açık bir akış elde edilir.

örnek 1

Aşağıdaki örnek program ile, popen sistem çağrısını kullanarak mevcut dizinde veya klasörde bulunan dosyaları okuyacağız. İlk olarak C standart kütüphanesinin stdio.h başlık dosyasını girdik. Ardından, popen işlevini yerleştirdiğimiz bir int main() işlevi programımız var. Bundan önce, “FILE” sınıfından “FileOpen” pointer değişkenini oluşturduk. Dosyanın işaretçi değişkeni, okunacak veya yazılacak sonraki baytı belirtir.







Ardından karakterin okunacak limit değerini belirledik. “FileOpen” değişkeni daha sonra “popen” işlevini çağırdı. “popen” işlevi, geçerli dizindeki tüm dosyaları listeleyecek olan Linux'un “ls -l” komutunu alır. Ayrıca popen fonksiyonuna okuma modunu gösteren “r” parametresini girdik.



Burada, popen fonksiyonunu kullanarak dosyaların okuma sürecini aktardık. Daha sonra oluşturulan boruyu while döngüsü ile işledik. while döngüsü, 'line', 'sizeof the line' ve 'FileOpen' argümanlarını alan fgets yöntemlerini kullanır. Fget'ler borulu işlemi okur ve onu dizgenin “%s” sembolüne kaydeder. Bu özel sembol, 'satır' argümanıyla birlikte printf yönteminin içinde çağrılır. İşlenen boruyu pclosed fonksiyonu ile oluşturduktan sonra, borulu proses aşağıdaki programın sonunda konuşlandırıldığı gibi kapatılabilir.



#include


int ana ( )

{

DOSYA * DosyaAç;

karakter çizgisi [ 130 ] ;


FileOpen = açılır ( 'ls -l' , 'r' ) ;

süre ( fget'lar ( satır, satır boyutu, FileOpen ) )

{

baskı ( '%s' , astar ) ;

}

kapatmak ( DosyaAç ) ;

}





C programının popen işlevi yukarıdaki süreci çatalladı ve ardından boruyu yarattı. Şimdi, C derleme komutu ile Shell'deki akımın işlenmiş borusunu çalıştırdık. Çıktı, programı bu dizinde yürüttüğümüz için “Ana” dizindeki tüm dosyaları listeledi.



Örnek 2

Önceki popen programında, dosyaların akış sürecini yönlendirmek için kullanılan popen programının işlevselliğinin basit bir gösterimine sahibiz. Şimdi, yazma modu ile süreci boruladığımız popen fonksiyonunun başka bir örneğini aldık. Ana işlevi olan programı ele alalım. Dosya işaretçi değişkenini ana fonksiyonun içinde “dosya” olarak oluşturduk. Dosya işaretçisi, popen işleviyle dağıtılır.

popen işlevi, yazma modu için “cat” komutunu ve “w” komutunu alır. Burada, her Dosya argümanı sırayla okunur ve cat komutu tarafından standart çıktıya gönderilir. For döngüsü gövdesinde, “%d” sembolünü belirttiğimiz gibi sayısal sayım değerlerini yazdırmak için fprintf fonksiyonunu kullandık. Daha sonra pclose sistem çağrısı ile popen pipe işlemi kapatılır.

#include


int ana ( int argc, karakter ** bağımsız değişken ) {

DOSYA * dosya = popen ( 'kedi' , 'içinde' ) ;

int x = 0 ;


için ( x = 0 ;x < 5 ;x++ ) {


fprintf ( dosya , 'Sayım = %d \n ' , x ) ;
}

kapatmak ( dosya ) ;

dönüş 0 ;

}

Yukarıda oluşturulan işlemi uyguladığımızda aşağıdaki şekilde sayım değerlerini yazdırdı.

Örnek 3

Şimdi, bir işlemin verilerini başka bir işleme aktaran başka bir programımız var. Bunu popen fonksiyonundan gelen boru ile yapacağız. Programı C'nin standart kütüphanelerini kullanarak gerçekleştirdik. Ardından, bir programı dağıtmak için bir int ana fonksiyonumuz var. Burada sprintf fonksiyonundaki stringi “buffer” argümanı ile belirledik. sprintf() işlevi, sonucu komut istemine göndermek yerine sprintf tarafından sağlanan char arabelleğinde tutar.

Daha sonra “read” değişkeninin içindeki popen fonksiyonunu çağırdık. Orada, popen fonksiyonu içinde iki işlemimiz var. Sağlanan karakterleri saymak için kullanılan ilk işlem “wc -c”, ikinci işlem ise borunun yazma modunda açık olduğunu gösteren “w” işlemidir. Bundan sonra, veri yazmak için boruyu kullanan “fwrite” fonksiyonumuz var. Veriler “wc” tarafından alınacak, ardından karakter sayılacak ve kabukta görüntülenecektir.

#include

#include

#include

#include

int ana ( )

{

DOSYA * okuman ;

karakter arabelleği [ elli ] ;

sprintf ( tampon, 'Linux Sistem çağrısı' ) ;

okuman = popen ( 'wc-c' , 'içinde' ) ;

fwrite ( arabellek, sizeof ( karakter ) ,strlen ( tampon ) , okuman ) ;

kapatmak ( okuman ) ;

}

Komut isteminde görüntülenen karakterler “17” çünkü yukarıda belirttiğimiz dize “17” karakter içeriyor. “wc -c” işlemi bu karakterleri okur ve çıktı olarak yazdırır.

Örnek 4

Yukarıdaki popen örneği, verileri bir süreçten diğerine gönderir. Burada, bir işlemden diğerine bir boru aracılığıyla verileri alacağız. Programın ana işlevi, “50” değerleri alan tamponu oluşturmaktır. Ardından, popen fonksiyonunun süreci yarattığı “r” değişkenini yarattık. “ls” işlemi dizindeki dosyaları listelemek için, “r” işlemi ise borudan veri okumak için kullanılır. “ls” işlemi, verileri okumak için “r” işlemine iletir. Bundan sonra, verileri okuyan ve verileri arabellekte saklayan fread işlevimiz var. Ardından, print ifadesi arabellekte depolanan verileri yazdıracaktır.

#include

#include

#include

#include

int ana ( )

{

DOSYA * r;

karakter arabelleği [ elli ] ;


r = popen ( 'ls' , 'r' ) ;

korku ( tampon, 1 , 25 , r ) ;


baskı ( '%s \n ' , arabellek ) ;

kapatmak ( r ) ;

}

Burada, çalışma dizininden mevcut dosyaların sadece “50” karakteri görüntülenir. Bu nedenle, çıktıda yalnızca 50 karakter olacaktır.

Çözüm

C dilinde Linux popen sistem çağrılarının ayrıntılı bir gösterimini verdik. Popen işlevini dağıttığımız dört örnek uyguladık. popen işlevi, atadığımız moda göre boru akışını döndürür. Örneklerde, fread ve fwrite dosya işleme işlevleriyle hem okuma hem de yazma modunu kullandık. İlk argüman olarak popen() işlevinde programın adını kullandık. İkinci argüman, okuma modu olarak “r” veya yazma modu olarak “w” dosyasıdır.