Cuộc gọi hệ thống Popen Linux trong C

Cuoc Goi He Thong Popen Linux Trong C



Hàm popen () sẽ thực hiện lệnh được đưa ra bởi lệnh của chuỗi. Hàm sẽ trả về một con trỏ đến một luồng được sử dụng để đọc hoặc ghi vào đường ống đồng thời tạo đường dẫn giữa ứng dụng đang gọi và lệnh được thực thi. Chức năng Popen có sẵn trong thư viện tiêu chuẩn của chức năng I / O và tạo ra quy trình thứ hai để chạy lệnh đầu cuối. Pha mở của hàm popen () giống như pha mở trong hàm fopen (). Hàm popen () bắt đầu một quy trình bằng cách fork, xây dựng một đường ống và thực thi shell. Vì một đường ống là một chiều theo mặc định; kết quả là luồng ở chế độ chỉ đọc hoặc chỉ ghi. Khi thực thi thành công hàm popen (), một luồng mở sẽ được sử dụng cho đường ống để đọc và ghi. '

ví dụ 1

Với chương trình ví dụ sau, chúng ta sẽ đọc các tệp tồn tại trong thư mục hoặc thư mục hiện tại bằng cách gọi hệ thống popen. Đầu tiên, chúng tôi đã nhập tệp tiêu đề stdio.h của thư viện tiêu chuẩn C. Sau đó, chúng ta có một hàm chương trình int main () nơi chúng ta đã triển khai hàm popen. Trước đó, chúng tôi đã thiết lập biến con trỏ “FileOpen” từ lớp “FILE”. Biến con trỏ của tệp cho biết byte kế tiếp để đọc hoặc ghi.







Sau đó, chúng tôi đã chỉ định giá trị giới hạn của ký tự được đọc. Biến “FileOpen” sau đó gọi hàm “popen”. Hàm “popen” sử dụng lệnh “ls -l” của Linux, lệnh này sẽ liệt kê tất cả các tệp của thư mục hiện tại. Hơn nữa, chúng tôi đã nhập tham số “r” trong hàm popen, cho biết chế độ đọc.



Ở đây, chúng tôi đã định hình quá trình đọc tệp bằng cách sử dụng chức năng popen. Tiếp theo, chúng tôi xử lý đường ống đã tạo bằng vòng lặp while. Vòng lặp while sử dụng các phương thức fgets, lấy các đối số “dòng”, “kích thước của dòng” và “FileOpen”. Các tiện ích đọc quá trình được tạo khung và lưu trữ nó vào biểu tượng “% s” của chuỗi. Biểu tượng cụ thể này được gọi bên trong phương thức printf cùng với đối số 'dòng'. Khi chúng ta đã xử lý xong đường ống, với chức năng pclosed, quá trình đường ống có thể được đóng lại như được triển khai ở cuối chương trình bên dưới.



#include


int main ( )

{

TẬP TIN * Mở tập tin;

dòng char [ 130 ] ;


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

trong khi ( đồ ăn vặt ( dòng, sizeof dòng, FileOpen ) )

{

printf ( '%S' , hàng ) ;

}

khăn trải giường ( Mở tập tin ) ;

}





Hàm popen của chương trình C đã tách quá trình trên và sau đó tạo đường ống. Bây giờ, chúng ta đã thực thi đường ống đã xử lý của luồng trong trình bao bằng lệnh biên dịch C. Kết quả đầu ra đã liệt kê tất cả các tệp trong thư mục “Trang chủ” khi chúng tôi đã thực thi chương trình trong thư mục đó.



Ví dụ 2

Trong chương trình popen trước đó, chúng tôi có một minh chứng đơn giản về chức năng của chương trình popen được sử dụng để định hình quá trình truyền trực tuyến của quá trình đọc tệp. Bây giờ, chúng ta đã lấy một ví dụ khác về hàm popen, nơi chúng ta đã định hướng quá trình với chế độ ghi. Hãy xem xét chương trình với chức năng chính. Chúng tôi đã xây dựng biến con trỏ tệp bên trong hàm chính dưới dạng “tệp”. Con trỏ tệp được triển khai với hàm popen.

Hàm popen nhận lệnh “cat” và “w” cho chế độ ghi. Ở đây, mỗi đối số Tệp được đọc tuần tự và gửi đến đầu ra tiêu chuẩn bằng lệnh cat. Trong phần nội dung vòng lặp for, chúng tôi đã sử dụng hàm fprintf để in các giá trị số đếm như chúng tôi đã chỉ định ký hiệu “% d”. Sau đó, đóng lại, quá trình popen pipe với lệnh gọi hệ thống pclose.

#include


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

TẬP TIN * tập tin = popen ( 'con mèo' , 'Trong' ) ;

int x = 0 ;


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


fprintf ( tập tin , 'Tổng số của tôi =% d \N ' , x ) ;
}

khăn trải giường ( tập tin ) ;

trở về 0 ;

}

Khi chúng tôi thực hiện quy trình được tạo ở trên, nó đã in các giá trị đếm theo cách sau.

Ví dụ 3

Bây giờ, chúng ta có một chương trình khác chuyển dữ liệu của một quá trình sang một quá trình khác. Chúng tôi sẽ làm điều này với đường ống từ chức năng popen. Chúng tôi đã triển khai chương trình bằng cách sử dụng các thư viện tiêu chuẩn của C. Sau đó, chúng tôi có một hàm int main để triển khai một chương trình. Ở đây, chúng tôi đã chỉ định chuỗi trong hàm sprintf với đối số 'buffer'. Hàm sprintf () giữ kết quả trên bộ đệm char do sprintf cung cấp thay vì gửi nó đến lời nhắc.

Sau đó, chúng tôi gọi hàm popen bên trong biến “read”. Ở đó, chúng ta có hai quy trình bên trong hàm popen. “Wc -c” là quá trình đầu tiên được sử dụng để đếm các ký tự được cung cấp và quá trình thứ hai là “w”, cho biết rằng đường ống đang mở ở chế độ ghi. Sau đó, chúng ta có hàm “fwrite” sử dụng đường ống để ghi dữ liệu. Dữ liệu sẽ được nhận bởi “wc”, sau đó đếm ký tự và hiển thị trong trình bao.

#include

#include

#include

#include

int main ( )

{

TẬP TIN * đọc ;

đệm char [ năm mươi ] ;

chạy nước rút ( đệm, 'Cuộc gọi hệ thống Linux' ) ;

đọc = popen ( 'wc -c' , 'Trong' ) ;

fwrite ( đệm, kích thước ( char ) , strlen ( đệm ) , đọc ) ;

khăn trải giường ( đọc ) ;

}

Các ký tự được hiển thị trong lời nhắc là “17” vì chuỗi chúng tôi đã chỉ định ở trên chứa các ký tự “17”. Quá trình “wc -c” đọc các ký tự này và in chúng dưới dạng đầu ra.

Ví dụ 4

Ví dụ ở trên về popen gửi dữ liệu từ quá trình này sang quá trình khác. Tại đây, chúng tôi sẽ nhận dữ liệu từ quy trình này sang quy trình khác thông qua một đường ống. Chức năng chính của chương trình là xây dựng bộ đệm, nhận các giá trị “50”. Sau đó, chúng tôi tạo biến “r”, nơi hàm popen tạo ra quy trình. Quá trình “ls” được sử dụng để liệt kê các tệp của thư mục và quá trình “r” để đọc dữ liệu từ đường ống. Quá trình “ls” truyền dữ liệu đến quá trình “r” để đọc. Sau đó, chúng ta có hàm fread, nó đọc dữ liệu và lưu trữ dữ liệu vào bộ đệm. Sau đó, câu lệnh in sẽ in dữ liệu được lưu trong bộ đệm.

#include

#include

#include

#include

int main ( )

{

TẬP TIN * r;

đệm char [ năm mươi ] ;


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

bánh mì ( đệm, 1 , 25 , r ) ;


printf ( '%S \N ' , đệm ) ;

khăn trải giường ( r ) ;

}

Ở đây chỉ có “50” ký tự của các tệp hiện có được hiển thị từ thư mục làm việc. Do đó, đầu ra sẽ chỉ có 50 ký tự.

Sự kết luận

Chúng tôi đã trình bày chi tiết về các lệnh gọi hệ thống popen Linux bằng ngôn ngữ C. Chúng tôi đã triển khai bốn ví dụ mà chúng tôi đã triển khai chức năng popen. Hàm popen trả về luồng đường ống theo chế độ mà chúng tôi đã chỉ định. Trong các ví dụ, chúng tôi đã sử dụng cả chế độ đọc và ghi với các chức năng xử lý tệp fread và fwrite. Chúng tôi đã sử dụng tên của chương trình trong hàm popen () làm đối số đầu tiên của nó. Đối số thứ hai là tệp “r” ở chế độ đọc hoặc “w” ở chế độ ghi.