Di Linux, paip ialah mekanisme komunikasi yang menghubungkan secara langsung output satu atur cara ke input atur cara lain. Pada dasarnya, paip juga merupakan sejenis fail, tetapi ia berbeza daripada fail umum Paip boleh mengatasi dua masalah menggunakan fail untuk komunikasi lebih cepat daripada Proses menulis adalah pantas.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
Pipeline ialah kaedah komunikasi yang sangat penting dalam Linux Ia menghubungkan secara langsung output satu program ke input program lain. Paip sering merujuk kepada paip yang tidak dinamakan hanya boleh digunakan antara proses yang berkaitan Ini adalah perbezaan terbesar antara mereka dan paip bernama.
Paip yang terkenal dipanggil paip atau FIFO (masuk dahulu, keluar dahulu), yang boleh dibuat dengan fungsi mkfifo().
Mekanisme pelaksanaan paip Linux
Di Linux, paip ialah mekanisme komunikasi yang sangat kerap digunakan. Pada dasarnya, paip juga adalah sejenis fail, tetapi ia berbeza daripada fail umum Paip boleh mengatasi dua masalah menggunakan fail untuk komunikasi:
Hadkan saiz saluran paip. Secara berkesan, paip adalah penimbal saiz tetap. Di Linux, saiz penimbal ini ialah 1 halaman, atau 4K bait, supaya saiznya tidak berkembang tanpa tanda seperti fail. Menggunakan penimbal tetap tunggal juga boleh menyebabkan masalah, seperti paip mungkin menjadi penuh semasa menulis Apabila ini berlaku, panggilan write() berikutnya ke paip akan secara lalai menyekat, menunggu beberapa data dibaca, supaya Buat ruang yang mencukupi. untuk panggilan write() untuk menulis.
Proses membaca juga mungkin berfungsi lebih cepat daripada proses menulis. Paip menjadi kosong apabila semua data proses semasa telah dibaca. Apabila ini berlaku, panggilan baca() seterusnya akan secara lalai disekat, menunggu beberapa data ditulis, yang menyelesaikan masalah panggilan baca() mengembalikan fail akhir.
Nota: Membaca data daripada paip ialah operasi sekali sahaja Setelah data dibaca, ia dibuang daripada paip untuk mengosongkan ruang untuk menulis lebih banyak data.
1. Struktur saluran paip
Di Linux, pelaksanaan saluran paip tidak menggunakan struktur data khas, tetapi bergantung pada struktur fail fail sistem dan inod nod Indeks VFS. Ini dicapai dengan menunjuk dua struktur fail ke nod indeks VFS sementara yang sama, yang seterusnya menghala ke halaman fizikal.
2. Membaca dan menulis paip
Kod sumber pelaksanaan saluran paip adalah dalam fs/pipe.c. Terdapat banyak fungsi dalam paip.c, dua daripada yang Fungsinya lebih penting, iaitu fungsi membaca paip pipe_read() dan fungsi menulis paip pipe_wrtie(). Fungsi tulis paip menulis data dengan menyalin bait ke memori fizikal yang ditunjukkan oleh nod indeks VFS, manakala fungsi baca paip membaca data dengan menyalin bait dalam memori fizikal. Sudah tentu, kernel mesti menggunakan mekanisme tertentu untuk menyegerakkan akses kepada paip Untuk tujuan ini, kernel menggunakan kunci, menunggu giliran dan isyarat.
Apabila proses menulis menulis ke paip, ia menggunakan fungsi perpustakaan standard write(). Struktur fail menentukan alamat fungsi yang digunakan untuk melaksanakan operasi tulis (iaitu, fungsi tulis), jadi kernel memanggil fungsi ini untuk menyelesaikan operasi tulis. Sebelum menulis data ke memori, fungsi tulis mesti terlebih dahulu menyemak maklumat dalam nod indeks VFS, dan hanya apabila syarat berikut dipenuhi, kerja salinan memori sebenar boleh dilakukan:
Dalam ingatan Terdapat ruang yang cukup untuk menampung semua data yang akan ditulis;
Jika syarat di atas dipenuhi pada masa yang sama, fungsi tulis mula-mula mengunci memori, dan kemudian menyalin data dari ruang alamat proses penulisan ke memori. Jika tidak, proses penulisan tidur dalam baris gilir menunggu nod indeks VFS Seterusnya, kernel akan memanggil penjadual, dan penjadual akan memilih proses lain untuk dijalankan. Proses menulis sebenarnya dalam keadaan menunggu yang terganggu Apabila terdapat ruang yang cukup dalam memori untuk menampung data bertulis, atau memori dibuka, proses membaca akan membangunkan proses menulis isyarat. Selepas data ditulis ke dalam ingatan, memori dibuka kunci dan semua proses bacaan yang tidur pada nod indeks dibangunkan.
Oleh kerana pelaksanaan saluran paip melibatkan operasi banyak fail, apabila pembaca selesai mempelajari sistem fail dan kemudian membaca kod dalam pipe.c, anda akan mendapati ia tidak sukar untuk difahami.
Paip Linux lebih mudah untuk dibuat dan digunakan, hanya kerana ia memerlukan lebih sedikit parameter. Untuk mencapai matlamat penciptaan paip yang sama seperti Windows, Linux dan UNIX gunakan coretan kod berikut:
Buat Linux bernama pipe
int fd1[2]; if(pipe(fd1)) { printf("pipe() FAILED: errno=%d",errno); return 1; }
Paip Linux mempunyai had pada saiz operasi tulis sebelum menyekat. Penampan peringkat kernel yang digunakan khusus untuk setiap paip adalah tepat 4096 bait. Operasi tulis yang lebih besar daripada 4K akan menyekat melainkan pembaca membersihkan paip. Dalam praktiknya, ini bukan batasan kerana operasi membaca dan menulis dilaksanakan dalam rangkaian yang berbeza.
Linux juga menyokong paip bernama. Seorang pengulas awal mengenai nombor ini mencadangkan bahawa saya harus, demi keadilan, membandingkan paip bernama Linux dengan paip bernama Windows. Saya menulis program lain yang menggunakan paip bernama di Linux. Saya mendapati bahawa tiada perbezaan dalam keputusan untuk paip bernama dan tidak dinamakan di Linux.
Paip Linux jauh lebih pantas daripada paip bernama Windows 2000, dan paip bernama Windows 2000 jauh lebih pantas daripada paip bernama Windows XP.
Contoh:
#include<stdio.h> #include<unistd.h> int main() { int n,fd[2]; // 这里的fd是文件描述符的数组,用于创建管道做准备的 pid_t pid; char line[100]; if(pipe(fd)<0) // 创建管道 printf("pipe create error/n"); if((pid=fork())<0) //利用fork()创建新进程 printf("fork error/n"); else if(pid>0){ //这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world" close(fd[0]); write(fd[1],"hello word/n",11); } else{ close(fd[1]); //这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据 n= read(fd[0],line,100); write(STDOUT_FILENO,line,n); } exit(0); }
Pembelajaran yang disyorkan: Tutorial video Linux
Atas ialah kandungan terperinci apakah saluran paip linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!