Linux Popen System Call ใน C

Linux Popen System Call Ni C



ฟังก์ชัน popen() จะดำเนินการคำสั่งที่กำหนดโดยคำสั่งของสตริง ฟังก์ชันควรส่งคืนตัวชี้ไปยังสตรีมที่ใช้ในการอ่านหรือเขียนไปยังไพพ์ ในขณะเดียวกันก็สร้างไพพ์ระหว่างแอปพลิเคชันที่เรียกและคำสั่งที่ดำเนินการ ฟังก์ชัน Popen มีอยู่ในไลบรารีมาตรฐานของฟังก์ชัน I/O และสร้างกระบวนการที่สองเพื่อเรียกใช้คำสั่งเทอร์มินัล เฟสเปิดของ popen() เหมือนกับเฟสเปิดในฟังก์ชัน fopen() ฟังก์ชัน popen() เริ่มต้นกระบวนการโดยการฟอร์ก สร้างไพพ์ และดำเนินการเชลล์ เนื่องจากไพพ์เป็นแบบทิศทางเดียวโดยค่าเริ่มต้น ด้วยเหตุนี้ สตรีมจึงเป็นแบบอ่านอย่างเดียวหรือเขียนอย่างเดียว ในการดำเนินการที่สำเร็จของฟังก์ชัน popen() จะได้รับสตรีมแบบเปิดซึ่งใช้สำหรับไพพ์เพื่ออ่านและเขียน”

ตัวอย่าง 1

ด้วยโปรแกรมตัวอย่างต่อไปนี้ เราจะอ่านไฟล์ที่มีอยู่ในไดเร็กทอรีหรือโฟลเดอร์ปัจจุบันโดยใช้การเรียกระบบ popen ประการแรก เราได้ป้อนไฟล์ส่วนหัว stdio.h ของไลบรารีมาตรฐาน C จากนั้น เรามีโปรแกรม int main() ฟังก์ชั่นที่เราได้ปรับใช้ฟังก์ชั่น popen ก่อนหน้านี้ เราได้สร้างตัวแปรตัวชี้ 'FileOpen' จากคลาส 'FILE' ตัวแปรพอยน์เตอร์ของไฟล์ระบุไบต์ที่จะอ่านหรือเขียนต่อจากนี้







หลังจากนั้นเรากำหนดค่าขีดจำกัดของตัวละครที่จะอ่าน ตัวแปร 'FileOpen' จากนั้นเรียกใช้ฟังก์ชัน 'popen' ฟังก์ชัน 'popen' ใช้คำสั่ง 'ls -l' ของ Linux ซึ่งจะแสดงรายการไฟล์ทั้งหมดของไดเร็กทอรีปัจจุบัน นอกจากนี้ เราได้ป้อนพารามิเตอร์ 'r' ในฟังก์ชัน popen ซึ่งระบุโหมดการอ่าน



ที่นี่ เราได้ไพพ์กระบวนการอ่านไฟล์โดยใช้ฟังก์ชัน popen ต่อไป เราประมวลผลไพพ์ที่สร้างด้วยลูป while while loop ใช้เมธอด fgets ซึ่งรับอาร์กิวเมนต์ 'line', 'size of the line' และ 'FileOpen' fgets อ่านกระบวนการไพพ์และเก็บไว้ในสัญลักษณ์ “%s” ของสตริง สัญลักษณ์นี้เรียกว่าภายในวิธี printf พร้อมกับอาร์กิวเมนต์ 'line' เมื่อเราสร้างไพพ์ที่ประมวลผลแล้ว ด้วยฟังก์ชัน pclosed กระบวนการไพพ์สามารถปิดได้ตามที่ปรับใช้ที่ส่วนท้ายของโปรแกรมด้านล่าง



#include


int หลัก ( )

{

ไฟล์ * ไฟล์เปิด;

สายอักขระ [ 130 ] ;


FileOpen = popen ( 'ล-ล' , 'ร' ) ;

ในขณะที่ ( fgets ( บรรทัด ขนาดของบรรทัด FileOpen ) )

{

printf ( '%s' , ไลน์ ) ;

}

pclose ( ไฟล์เปิด ) ;

}





ฟังก์ชัน popen ของโปรแกรม C แยกกระบวนการข้างต้นแล้วสร้างไพพ์ ตอนนี้ เราได้ดำเนินการไพพ์ที่ประมวลผลแล้วของสตรีมในเชลล์ด้วยคำสั่งการคอมไพล์ C ผลลัพธ์ได้แสดงรายการไฟล์ทั้งหมดในไดเร็กทอรี 'Home' ขณะที่เรารันโปรแกรมในไดเร็กทอรีนั้น



ตัวอย่าง 2

ในโปรแกรม popen ก่อนหน้านี้ เรามีการสาธิตการใช้งานอย่างง่ายของโปรแกรม popen ที่ใช้สำหรับไพพ์กระบวนการสตรีมการอ่านไฟล์ ตอนนี้ เราได้ยกตัวอย่างอื่นของฟังก์ชัน popen ซึ่งเราได้ไพพ์กระบวนการด้วยโหมดการเขียน ลองพิจารณาโปรแกรมที่มีฟังก์ชั่นหลัก เราได้สร้างตัวแปรตัวชี้ไฟล์ภายในฟังก์ชันหลักเป็น 'ไฟล์' ตัวชี้ไฟล์ถูกปรับใช้ด้วยฟังก์ชัน popen

ฟังก์ชัน popen ใช้คำสั่ง 'cat' และ 'w' สำหรับโหมดเขียน ที่นี่ แต่ละอาร์กิวเมนต์ File จะถูกอ่านตามลำดับและส่งไปยังเอาต์พุตมาตรฐานโดยคำสั่ง cat ในส่วน for loop เราใช้ฟังก์ชัน fprintf เพื่อพิมพ์ค่าการนับตัวเลขตามที่เราได้ระบุสัญลักษณ์ '%d' จากนั้นปิดกระบวนการท่อป๊อปด้วยการโทรระบบ pclose

#include


int หลัก ( int argc, อักขระ ** argv ) {

ไฟล์ * ไฟล์ = โป๊ป ( 'แมว' , 'ใน' ) ;

int x = 0 ;


สำหรับ ( x = 0 ;x < 5 ;x++ ) {


fprintf ( ไฟล์ , 'จำนวนของฉัน = %d \n ' , x ) ;
}

pclose ( ไฟล์ ) ;

กลับ 0 ;

}

เมื่อเราดำเนินการตามกระบวนการที่สร้างไว้ข้างต้น มันจะพิมพ์ค่าการนับในลักษณะต่อไปนี้

ตัวอย่างที่ 3

ตอนนี้ เรามีโปรแกรมอื่นที่ถ่ายโอนข้อมูลของกระบวนการหนึ่งไปยังอีกกระบวนการหนึ่ง เราจะทำสิ่งนี้กับไพพ์จากฟังก์ชัน popen เราได้นำโปรแกรมไปใช้โดยใช้ไลบรารีมาตรฐานของ C จากนั้นเรามีฟังก์ชันหลักในการปรับใช้โปรแกรม ที่นี่ เราได้ระบุสตริงในฟังก์ชัน sprintf ด้วยอาร์กิวเมนต์ 'buffer' ฟังก์ชัน sprintf() จะเก็บผลลัพธ์บนบัฟเฟอร์ char ที่จัดเตรียมโดย sprintf แทนที่จะส่งไปที่พรอมต์

หลังจากนั้น เราเรียกฟังก์ชัน popen ภายในตัวแปร 'read' ที่นั่น เรามีสองกระบวนการภายในฟังก์ชัน popen “wc -c” เป็นกระบวนการแรกที่ใช้ในการนับอักขระที่ให้มา และกระบวนการที่สองคือ “w” ซึ่งระบุว่าไพพ์เปิดอยู่ในโหมดการเขียน หลังจากนั้น เรามีฟังก์ชัน 'fwrite' ที่ใช้ไพพ์เพื่อเขียนข้อมูล ข้อมูลจะได้รับโดย 'wc' จากนั้นนับอักขระและแสดงในเชลล์

#รวม

#include

#include

#include

int หลัก ( )

{

ไฟล์ * อ่าน ;

ถ่านบัฟเฟอร์ [ ห้าสิบ ] ;

sprintf ( กันชน, 'การเรียกระบบ Linux' ) ;

อ่าน =ป๊อปปี้ ( 'wc -c' , 'ใน' ) ;

fwrite ( บัฟเฟอร์ sizeof ( char ) ,strlen ( กันชน ) , อ่าน ) ;

pclose ( อ่าน ) ;

}

อักขระที่แสดงในพรอมต์คือ '17' เนื่องจากสตริงที่เราระบุไว้ข้างต้นมีอักขระ '17' กระบวนการ “wc -c” จะอ่านอักขระเหล่านี้และพิมพ์ออกมาเป็นเอาต์พุต

ตัวอย่างที่ 4

ตัวอย่างข้างต้นของ popen ส่งข้อมูลจากกระบวนการหนึ่งไปยังอีกกระบวนการหนึ่ง ที่นี่ เราจะได้รับข้อมูลจากกระบวนการหนึ่งไปยังอีกกระบวนการหนึ่งผ่านท่อ หน้าที่หลักของโปรแกรมคือการสร้างบัฟเฟอร์ ซึ่งใช้ค่า '50' จากนั้นเราสร้างตัวแปร 'r' โดยที่ฟังก์ชัน popen สร้างกระบวนการ กระบวนการ “ls” ใช้เพื่อแสดงรายการไฟล์ของไดเร็กทอรี และกระบวนการ “r” สำหรับการอ่านข้อมูลจากไพพ์ กระบวนการ “ls” ส่งข้อมูลไปยังกระบวนการ “r” เพื่ออ่าน หลังจากนี้ เรามีฟังก์ชัน fread ซึ่งอ่านข้อมูลและเก็บข้อมูลไว้ในบัฟเฟอร์ จากนั้นคำสั่งพิมพ์จะพิมพ์ข้อมูลที่เก็บไว้ในบัฟเฟอร์

#รวม

#include

#include

#include

int หลัก ( )

{

ไฟล์ * ร;

ถ่านบัฟเฟอร์ [ ห้าสิบ ] ;


r = popen ( 'ลส' , 'ร' ) ;

ขนมปัง ( กันชน, 1 , 25 , ร ) ;


printf ( '%s \n ' , กันชน ) ;

pclose ( r ) ;

}

ที่นี่จะแสดงเฉพาะอักขระ '50' ของไฟล์ที่มีอยู่จากไดเร็กทอรีการทำงาน ดังนั้นเอาต์พุตจะมีเพียง 50 อักขระเท่านั้น

บทสรุป

เราได้ให้การสาธิตโดยละเอียดของการเรียกระบบ Linux popen ในภาษา C เราได้นำตัวอย่างสี่ตัวอย่างที่เราปรับใช้ฟังก์ชัน popen ฟังก์ชัน popen ส่งคืนท่อสตรีมตามโหมดที่เรากำหนด ในตัวอย่าง เราได้ใช้ทั้งโหมดอ่านและเขียนพร้อมฟังก์ชันจัดการไฟล์ fread และ fwrite เราใช้ชื่อของโปรแกรมในฟังก์ชัน popen() เป็นอาร์กิวเมนต์แรก อาร์กิวเมนต์ที่สองคือไฟล์ 'r' ที่อ่านแล้วหรือ 'w' เป็นโหมดเขียน