Cách sử dụng lệnh gọi hệ thống mở trong C

How Use Open System Call C



Các lệnh gọi hệ thống được sử dụng trong các bản phân phối Linux để cung cấp một cánh cửa trong Hệ điều hành Linux và các chương trình. Hệ điều hành Linux sử dụng thư viện Glibc để hỗ trợ các lệnh gọi hệ thống trong đó khi sử dụng ngôn ngữ C. Có rất nhiều cách khác để sử dụng lệnh gọi hệ thống. Trong hướng dẫn bài viết này, chúng ta sẽ thảo luận về lệnh gọi hệ thống mở trong hệ thống Linux. Lời gọi Hệ thống mở đã được sử dụng để mở tệp được chỉ định trong đường dẫn một cách nhanh chóng. Nó cho chúng tôi biết về bộ mô tả tệp của tệp do người dùng tạo. Chúng tôi đang sử dụng Ubuntu 20.04 để thực hiện một số cuộc gọi hệ thống Mở thực hành.

Cài đặt thư viện

Ngôn ngữ C yêu cầu một số gói thư viện bổ sung được cài đặt làm điều kiện tiên quyết. Trước hết, bạn cần cài đặt gói manpages-dev để kiểm tra thông tin liên quan đến các cuộc gọi hệ thống. Mở thiết bị đầu cuối dòng lệnh từ khu vực hoạt động và thực hiện hướng dẫn dưới đây để cài đặt manpages.







$ sudo apt cài đặt manpages-nhà phát triển



Đầu ra để hoàn thành cài đặt đã được đưa ra bên dưới.







Bây giờ chúng ta sẽ kiểm tra lệnh gọi hệ thống đang mở bằng cách sử dụng lệnh man như bên dưới.

$ man2mở ra



Trang người đàn ông đầu ra cho lệnh gọi Hệ thống mở đã được hiển thị bên dưới. Bạn có thể xem thông tin bổ sung liên quan đến nó. Nhấn nút q để thoát.

Cú pháp trên hiển thị ba dòng thư viện cần thiết đầu tiên được thêm vào cho các lệnh gọi hệ thống. Có ba cú pháp có sẵn cho cuộc gọi hệ thống mở. Cú pháp đầu tiên hiển thị tên đường dẫn, là tên của tệp sẽ được mở. Tham số thứ hai, cờ, hiển thị chế độ của tệp, ví dụ: đọc hoặc ghi. Cú pháp thứ hai có thể được sử dụng khi tệp không tồn tại. Chế độ tham số được sử dụng để hiển thị các đặc quyền trên tệp.

Bây giờ đã đến lúc cài đặt trình biên dịch GCC để gỡ lỗi mã C trong bản phân phối Linux Ubuntu 20.04. Đối với điều đó, hãy thực hiện hướng dẫn bên dưới trong trình bao để làm như vậy.

$ sudo apt cài đặt gcc

Nó yêu cầu bạn nhấn vào Y để tiếp tục cài đặt trình biên dịch GCC, nếu không nhấn nút n để đóng cài đặt. Vì vậy, hãy nhấn nút y và nhấn Enter để tiếp tục.

Đầu ra cho việc hoàn thành được hiển thị bên dưới.

Ví dụ 01

Hãy xem ví dụ rất đơn giản về lệnh gọi Hệ thống mở. Trước hết, hãy mở command shell và tạo một tệp văn bản test.txt mới bằng cách sử dụng lệnh cảm ứng đơn giản như sau:

$chạm vàotest.txt

Thêm một số dữ liệu vào nó theo cách thủ công. Bạn có thể xem dữ liệu trong tệp bằng lệnh cat dưới đây.

$con mèotest.txt

Bây giờ, hãy tạo một tệp C mới bằng cách sử dụng lệnh nano trong shell, như được hiển thị bên dưới.

$nanonew.c

Tệp nano GNU bên dưới sẽ được mở. Bạn phải nhập mã ngôn ngữ C bên dưới vào đó. Bạn có thể thấy chúng tôi đã thêm các gói thư viện cần thiết để mã C được thực thi đúng cách. Sau đó, chúng tôi đã xác định chức năng chính để hoạt động trên một cuộc gọi Hệ thống mở. Chúng tôi đã khai báo hai biến số nguyên. Biến n được sử dụng để đếm các giá trị bộ đệm và fd được sử dụng cho bộ mô tả tệp. Chúng tôi đã khai báo mảng đệm kiểu ký tự là buf có kích thước 50. Lệnh gọi hệ thống đang mở đã được sử dụng để đọc nội dung từ tệp test.txt và trả nó về bộ mô tả tệp. O_RDONLY đã được sử dụng cho mục đích đọc. Dòng tiếp theo hiển thị lệnh gọi hệ thống đọc để thu thập 10 byte từ bộ đệm và trả về số nguyên n. Ngoài ra, lệnh write đã được sử dụng để ghi nội dung hoặc dữ liệu đệm vào bộ mô tả tệp, đây là màn hình xuất Trong trường hợp của chúng ta ngay bây giờ. Lưu tệp này bằng Ctrl + S và đóng tệp bằng lệnh Ctrl + X.

#bao gồm
#bao gồm
#bao gồm
#bao gồm

NSchủ chốt()
{
NSn,fd;
charbuf[năm mươi];
fd=mở ra(kiểm tra.txt,O_RDONLY);
n=đọc(fd,buf, 10);
viết(1 ,buf, 10);

Đầu tiên chúng ta hãy biên dịch mã C cho lệnh gọi hệ thống mở bằng lệnh gcc bên dưới.

$gccnew.c

Bây giờ đã đến lúc kiểm tra đầu ra cho mã C cho một lệnh gọi hệ thống đang mở. Hãy sử dụng lệnh a.out bên dưới trong trình bao. Đầu ra hiển thị 10 byte từ nội dung của tệp test.txt.

$./đến.ngoài

Hãy lấy một ví dụ khác để ghi nội dung của một tệp này vào một tệp khác bằng lệnh gọi Hệ thống mở. Để tạo một tệp C mới bằng cách sử dụng lệnh nano như bên dưới.

$ nano mới.NS

Vì vậy, hãy lấy cùng một mã với một thay đổi nhỏ trong đó. Chúng tôi đã xác định một bộ mô tả tệp khác trong mã là fd1. Tất cả các mã đều giống nhau ngoại trừ một dòng bổ sung. Dòng cuối cùng thứ hai của mã đã sử dụng lệnh gọi hệ thống mở để tạo tệp mới có tên đích bằng cách sử dụng O_CREAT và chế độ, chỉ ghi là O_WRONLY. 0642 hiển thị các đặc quyền được gán cho tệp này. Và tệp đã được trả về một bộ mô tả tệp mới. Dòng tiếp theo hiển thị một lệnh để ghi các byte nội dung trong bộ đệm theo bộ mô tả tệp của nó. Lưu file và đóng nó lại.

Thực thi lệnh biên dịch gcc để gỡ lỗi tệp ngôn ngữ C.

$ gcc mới.NS

Để hiển thị đầu ra của mã C, hãy thử hướng dẫn a.out trong shell như bên dưới. Không có đầu ra vì đầu ra đã được chuyển hướng đến mục tiêu tệp mới được tạo.

$./đến.ngoài

Hãy kiểm tra dữ liệu của mục tiêu tệp bằng lệnh cat. Kết quả đầu ra cho thấy rằng tệp có 20 byte trong đó.

mục tiêu $ cat

Phần kết luận

Trong hướng dẫn trên, chúng tôi đã giải thích cho bạn cách sử dụng lệnh gọi hệ thống mở bằng ngôn ngữ C bằng cách sử dụng trình biên dịch gcc. Với sự trợ giúp của các ví dụ khác nhau được giải thích trong hướng dẫn này sẽ giúp bạn triển khai chương trình mong muốn của mình.