Panggilan Sistem Popen Linux dalam C

Panggilan Sistem Popen Linux Dalam C



Fungsi popen() akan menjalankan arahan yang diberikan oleh arahan rentetan. Fungsi ini harus mengembalikan penunjuk ke aliran yang digunakan untuk membaca atau menulis ke paip sambil juga mencipta paip antara aplikasi panggilan dan arahan yang dilaksanakan. Fungsi Popen tersedia dalam pustaka standard fungsi I/O dan menghasilkan proses kedua untuk menjalankan perintah terminal. Fasa terbuka popen() adalah sama dengan fasa terbuka dalam fungsi fopen(). Fungsi popen() memulakan proses dengan membuat forking, membina paip dan melaksanakan shell. Oleh kerana paip adalah satu arah secara lalai; akibatnya, strim adalah sama ada baca sahaja atau tulis sahaja. Pada pelaksanaan fungsi popen() yang berjaya, aliran terbuka diperoleh yang digunakan untuk paip membaca dan menulis.'

Contoh 1

Dengan contoh program berikut, kami akan membaca fail yang wujud dalam direktori atau folder semasa menggunakan panggilan sistem popen. Pertama, kami telah memasukkan fail pengepala stdio.h pustaka standard C. Kemudian, kami mempunyai program int main()fungsi di mana kami telah menggunakan fungsi popen. Sebelum ini, kami menubuhkan pembolehubah penunjuk 'FileOpen' daripada kelas 'FILE'. Pembolehubah penunjuk fail menunjukkan bait yang berjaya untuk membaca atau menulis.







Selepas itu, kami menetapkan nilai had aksara untuk dibaca. Pembolehubah 'FileOpen' kemudian menggunakan fungsi 'popen'. Fungsi 'popen' mengambil arahan 'ls -l' Linux, yang akan menyenaraikan semua fail direktori semasa. Selain itu, kami telah memasukkan parameter 'r' dalam fungsi popen, yang menunjukkan mod baca.



Di sini, kami telah menyalurkan proses membaca fail dengan menggunakan fungsi popen. Seterusnya, kami memproses paip yang dibuat dengan gelung while. Gelung while menggunakan kaedah fgets, yang mengambil hujah 'garis', 'saiz baris' dan 'FailOpen'. Fgets membaca proses paip dan menyimpannya ke dalam simbol rentetan '%s'. Simbol khusus ini dipanggil di dalam kaedah printf bersama-sama dengan hujah 'garisan'. Sebaik sahaja kami telah mencipta paip yang diproses, dengan fungsi pclosed, proses paip boleh ditutup seperti yang digunakan pada penghujung program di bawah.



#include


int utama ( )

{

FAIL * FailBuka;

baris char [ 130 ] ;


FailOpen = popen ( 'ls -l' , 'r' ) ;

sementara ( fgets ( baris, saiz baris, FailBuka ) )

{

printf ( '%s' , baris ) ;

}

pclose ( FailBuka ) ;

}





Fungsi popen program C memotong proses di atas dan kemudian mencipta paip. Sekarang, kami telah melaksanakan paip aliran yang diproses dalam shell dengan arahan kompilasi C. Output telah menyenaraikan semua fail dalam direktori 'Home' kerana kami telah melaksanakan program dalam direktori tersebut.



Contoh 2

Dalam program popen sebelum ini, kami mempunyai demonstrasi ringkas kefungsian program popen yang digunakan untuk menyalurkan proses penstriman membaca fail. Sekarang, kami telah mengambil satu lagi contoh fungsi popen di mana kami telah menyalurkan proses dengan mod tulis. Mari kita pertimbangkan program dengan fungsi utama. Kami telah membina pembolehubah penunjuk fail di dalam fungsi utama sebagai 'fail'. Penunjuk fail digunakan dengan fungsi popen.

Fungsi popen mengambil arahan 'kucing' dan 'w' untuk mod tulis. Di sini, setiap hujah Fail dibaca secara berurutan dan dihantar ke output standard oleh arahan kucing. Dalam badan gelung untuk, kami telah menggunakan fungsi fprintf untuk mencetak nilai kiraan berangka kerana kami telah menetapkan simbol '%d'. Kemudian ditutup, proses paip popen dengan panggilan sistem pclose.

#include


int utama ( int argc, char ** argv ) {

FAIL * fail = popen ( 'kucing' , 'dalam' ) ;

int x = 0 ;


untuk ( x = 0 ;x < 5 ;x++ ) {


fprintf ( fail , 'Kiraan Saya = %d \n ' , x ) ;
}

pclose ( fail ) ;

kembali 0 ;

}

Apabila kami melaksanakan proses yang dibuat di atas, ia mencetak nilai kiraan dengan cara berikut.

Contoh 3

Kini, kami mempunyai program lain yang memindahkan data satu proses ke proses lain. Kami akan melakukan ini dengan paip dari fungsi popen. Kami telah melaksanakan program dengan menggunakan perpustakaan standard C. Kemudian, kami mempunyai fungsi utama int untuk menggunakan program. Di sini, kami telah menentukan rentetan dalam fungsi sprintf dengan hujah 'penampan'. Fungsi sprintf() menyimpan hasil pada penimbal char yang disediakan oleh sprintf dan bukannya menghantarnya ke gesaan.

Selepas itu, kami memanggil fungsi popen di dalam pembolehubah 'baca'. Di sana, kami mempunyai dua proses di dalam fungsi popen. 'wc -c' ialah proses pertama yang digunakan untuk mengira aksara yang disediakan, dan proses kedua ialah 'w,' yang menunjukkan bahawa paip terbuka dalam mod penulisan. Selepas itu, kami mempunyai fungsi 'fwrite' yang menggunakan paip untuk menulis data. Data akan diterima oleh 'wc', kemudian mengira aksara dan dipaparkan dalam cangkerang.

#include

#include

#include

#include

int utama ( )

{

FAIL * membaca ;

penampan char [ lima puluh ] ;

sprintf ( penampan, 'Panggilan Sistem Linux' ) ;

membaca = popen ( 'wc -c' , 'dalam' ) ;

fwrite ( penimbal, saiz ( char ) , strlen ( penampan ) , membaca ) ;

pclose ( membaca ) ;

}

Aksara yang dipaparkan dalam gesaan ialah '17' kerana rentetan yang telah kami tentukan di atas mengandungi aksara '17'. Proses 'wc -c' membaca aksara ini dan mencetaknya sebagai output.

Contoh 4

Contoh popen di atas menghantar data dari satu proses ke proses yang lain. Di sini, kami akan menerima data dari satu proses ke proses yang lain melalui paip. Fungsi utama program ini adalah untuk membina penimbal, yang mengambil nilai '50'. Kemudian, kami mencipta pembolehubah 'r,' di mana fungsi popen mencipta proses. Proses 'ls' digunakan untuk menyenaraikan fail direktori, dan proses 'r' untuk membaca data daripada paip. Proses 'ls' menghantar data ke proses 'r' untuk dibaca. Selepas ini, kita mempunyai fungsi fread, yang membaca data dan menyimpan data dalam penimbal. Kemudian, pernyataan cetakan akan mencetak data yang disimpan dalam penimbal.

#include

#include

#include

#include

int utama ( )

{

FAIL * r;

penampan char [ lima puluh ] ;


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

ketakutan ( penampan, 1 , 25 , r ) ;


printf ( '%s \n ' , penimbal ) ;

pclose ( r ) ;

}

Di sini hanya '50' aksara fail sedia ada dipaparkan dari direktori kerja. Oleh itu, output hanya akan mempunyai 50 aksara.

Kesimpulan

Kami telah memberikan demonstrasi terperinci tentang panggilan sistem popen Linux dalam bahasa C. Kami telah melaksanakan empat contoh di mana kami telah menggunakan fungsi popen. Fungsi popen mengembalikan aliran paip mengikut mod yang telah kami tetapkan. Dalam contoh, kami telah menggunakan kedua-dua mod baca dan tulis dengan fungsi pengendalian fail fread dan fwrite. Kami telah menggunakan nama program dalam fungsi popen() sebagai hujah pertamanya. Argumen kedua ialah fail 'r' sebagai dibaca atau 'w' sebagai mod tulis.