Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
5,51 MB
Nội dung
Linux ProgramingLinux Programing System callsSystem calls System call thường là một yêu cầu đến hệ điều System call thường là một yêu cầu đến hệ điều hành để làm một tác vụ phần cứng/chuyên biệt hành để làm một tác vụ phần cứng/chuyên biệt hệ thống hay tác vụ đặc quyền hệ thống . hệ thống hay tác vụ đặc quyền hệ thống . Trong LinuxTrong Linux 1.2 có 140 system calls được định 1.2 có 140 system calls được định nghĩa. nghĩa. System calls như System calls như close()close() được hiện thực trong được hiện thực trong Linux libc. Linux libc. Việc hiện thực này xoay quanh việc gọi một là Việc hiện thực này xoay quanh việc gọi một là syscall().syscall(). Các tham số truyền vào syscall() là số hiệu Các tham số truyền vào syscall() là số hiệu system call và được theo sau bởi các tham số system call và được theo sau bởi các tham số cần thiết cần thiết System callsSystem calls Số hiệu của system call có tìm thể thấy ở Số hiệu của system call có tìm thể thấy ở < linux/unistd.h > < linux/unistd.h > Trong đó < sys/syscall.h > được cập nhật Trong đó < sys/syscall.h > được cập nhật với libc mới.với libc mới. Nếu có các calls xuất hiện mà chúng chưa Nếu có các calls xuất hiện mà chúng chưa có trong libc, ta có thể gọi syscall().có trong libc, ta có thể gọi syscall(). System callsSystem calls Ví dụ, ta có thể đóng file dùng syscall() như sau Ví dụ, ta có thể đóng file dùng syscall() như sau (không khuyến khích):(không khuyến khích): #include <syscall.h>#include <syscall.h> extern int syscall(int, );extern int syscall(int, ); int my_close(int filedescriptor)int my_close(int filedescriptor) {{ return syscall(SYS_close, filedescriptor);return syscall(SYS_close, filedescriptor); }} System call ParametersSystem call Parameters Trên kiến trúc i386 , system calls bị giới hạn đến Trên kiến trúc i386 , system calls bị giới hạn đến 5 tham số không kể đến số hiệu system call bởi 5 tham số không kể đến số hiệu system call bởi vì việc hạn chế số lượng thanh ghi vì việc hạn chế số lượng thanh ghi Nếu bạn dùng Linux trên một kiến trúc khác, ta Nếu bạn dùng Linux trên một kiến trúc khác, ta có thể check kiểm tra <asm/unistd.h> để tìm có thể check kiểm tra <asm/unistd.h> để tìm các syscall macros để xem phần cứng của bạn các syscall macros để xem phần cứng của bạn có thể hỗ trợ đến bao nhiêu tham sốcó thể hỗ trợ đến bao nhiêu tham số Các syscall macro này có thể được dùng thay Các syscall macro này có thể được dùng thay thế cho syscall(), nhưng nó không được khuyến thế cho syscall(), nhưng nó không được khuyến khích khi đã có những macro được phát triển khích khi đã có những macro được phát triển thành các hàm đầy đủ tồn tại trong thư viện lập thành các hàm đầy đủ tồn tại trong thư viện lập trìnhtrình System call Parameters (tt)System call Parameters (tt) Do đó chỉ có những tay chuyên nghiệp mới nên Do đó chỉ có những tay chuyên nghiệp mới nên chơi với các syscall macros. Ví dụ đây là một chơi với các syscall macros. Ví dụ đây là một hàm close() có dùng syscall macro.hàm close() có dùng syscall macro. #include <linux/unistd.h>#include <linux/unistd.h> _syscall1(int, close, int, _syscall1(int, close, int, filedescriptor);filedescriptor); syscall1 macro mở rộng hàm close(). Do đó ta syscall1 macro mở rộng hàm close(). Do đó ta có close() xuất hiện 2 lần: một trong libc và một có close() xuất hiện 2 lần: một trong libc và một trong chương trình của ta. Giá trị trả về của trong chương trình của ta. Giá trị trả về của syscall() hay syscall macro là syscall() hay syscall macro là 1 nếu system call 1 nếu system call thất bại và 0 hoặc lớn hơn nếu thành công. thất bại và 0 hoặc lớn hơn nếu thành công. System Call không có trong LinuxSystem Call không có trong Linux Các system call sau là tồn tại trên BSD và Các system call sau là tồn tại trên BSD và SYS V nhưng không tồn tại trên Linux:SYS V nhưng không tồn tại trên Linux: audit(), auditon(), auditsvc(), fchroot(), audit(), auditon(), auditsvc(), fchroot(), getauid(), getdents(), getmsg(), mincore(), getauid(), getdents(), getmsg(), mincore(), poll(),putmsg(), setaudit(), setauid(). poll(),putmsg(), setaudit(), setauid(). The “swiss army knife” ioctlThe “swiss army knife” ioctl phillips screwdriver, screwdriver, screwdriver, screwdriver, corkscrew, scissors, metal saw, wood saw, can opener, mini screwdriver, nailfile, metal file, wire bender, large blade, small blade, cap lifter, wire stripper, reamer, punch, key ring, tweezers, multi-purpose hook, chisel, wire cutters, pin, nail cleaner, multipurpose pliers, clef 6 pans 5mm pour connecteurs D- SUB,embout Pozidrive 0, embout Pozidrive 1, embout tournevis, embout Phillips 2, embout Hex (inbus), embout Torx 8, embout Torx 10, embout Torx 15, long ballpoint pen, toothpick http://www.swiss-knife.com/asp/detail.asp?lan=EN&code=1.7775.T&shop=SK The “swiss army knife” ioctlThe “swiss army knife” ioctl ioctl viết tắt cho input/output control và ioctl viết tắt cho input/output control và nó được dùng để thao tác đến các nó được dùng để thao tác đến các character device thông qua filedescriptor. character device thông qua filedescriptor. Format của ioctl là Format của ioctl là ioctl(unsigned int fd, unsigned int request, ioctl(unsigned int fd, unsigned int request, unsigned long argument)unsigned long argument) . . Giá trị trả về là Giá trị trả về là 1 nếu có lỗi và =0 nếu 1 nếu có lỗi và =0 nếu request thành công (tương tự như các system request thành công (tương tự như các system call khác). call khác). ioctl (tt)ioctl (tt) Kernel phân biệt các file đặc biệt và file thông Kernel phân biệt các file đặc biệt và file thông thường . File đặc biệt là những file nằm trong thường . File đặc biệt là những file nằm trong /dev và /proc. Chúng khác với các file thông /dev và /proc. Chúng khác với các file thông thường là chúng dấu các giao diện với driver thường là chúng dấu các giao diện với driver và không phải là một file thật sự chứa dữ liệu và không phải là một file thật sự chứa dữ liệu text hay binary. Đây là triết lý của UNIX và text hay binary. Đây là triết lý của UNIX và cho phép dùng các thao tác read/write thông cho phép dùng các thao tác read/write thông thường trên tất cả các file. thường trên tất cả các file. Bạn sẽ cần dùng ioctl nhiều khi thao tác với Bạn sẽ cần dùng ioctl nhiều khi thao tác với các file đặc biệt hơn là với các file thường. các file đặc biệt hơn là với các file thường. Nhưng bạn cũng có thể dùng ioctl trên các file Nhưng bạn cũng có thể dùng ioctl trên các file thường !thường ! [...]...InterProcess Communications-IPC nterP ommunications Cơ chế IPC trong Linux cung cấp một phương pháp cho nhiều tiến trình giao tiếp với nhau Có nhiều phương pháp IPC cho Linux C programmers áp dụng: Half-duplex UNIX pipes FIFOs (named pipes) SYSV style message queues SYSV style semaphore sets SYSV style... Full-duplex pipes (STREAMS pipes,, không đề cập ) Các phương pháp này, khi được dùng một cách hiệu quả, sẽ mang lại một framework vững chắc cho client/server development trên bất kỳ một hệ UNIX nào (bao gồm cả Linux) HalfHalf-duplex UNIX Pipes Khái niệm căn bản: pipe là một phương pháp của việc kết nối standard output của một tiến trình process vào một standard input của tiến trình khác Pipes là một công... invalid) EACCES (permission denied) ENAMETOOLONG (pathname too long) ENOENT (invalid pathname) ENOTDIR (invalid pathname) NOTES: Tạo filesystem node (file, device file, or FIFO) mknod Muốn biến rõ hơn về mknod thì hãy dùng lệnh man,nhưng man,nhưng xét ví dụ đơn giản sau trong C: mknod("/tmp/MYFIFO", S_IFIFO|0666, 0); Ở đây, file “/tmp/MYFIFO” được tạo ra như là một FIFO file Quyền của file là “0666”,... xem như pipe là một stream, mở nó ra với fopen() và đóng với fclose() fifoserver.c #include #include #include #include #include #define FIFO_FILE "MYFIFO" int main(void) { FILE *fp; char readbuf[80]; /* Create the FIFO if it does not exist */ umask(0); mknod(FIFO_FILE, S_IFIFO|0666, 0); fifoserver.c (tt) ... writer Nếu một process cố gắng ghi vào một pipe mà không có reader, nó sẽ được gửi đến 1 tín hiệu SIGPIPE từ kernel Điều này là bắt buộc khi có nhiều hơn hai tiến trình thao tác với một pipeline TCP/IP in Linux Introduction Socket Client.c Server.c Introduction Socket Client.c #include #include #include #include #include #include... int main() { int sockfd; int len; struct sockaddr_in address; int result; char ch = 'A'; sockfd = socket(AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr( "127 .0.0.1"); address.sin_port = 9734; len = sizeof(address); result = connect(sockfd, (struct sockaddr *)&address, len); if(result == -1) { perror("oops: client1 problem"); exit(1); } write(sockfd, &ch,... accept(server_sockfd, SOCK_STREAM, 0); (struct sockaddr server_address.sin_family = AF_INET; *)&client_address, &client_len); server_address.sin_addr.s_addr = read(client_sockfd, &ch, 1); ch++; inet_addr( "127 .0.0.1"); write(client_sockfd, &ch, 1); server_address.sin_port = 9734; server_len = sizeof(server_address); close(client_sockfd); } } . Linux ProgramingLinux Programing System callsSystem calls System call thường là một yêu cầu đến hệ điều. close()close() được hiện thực trong được hiện thực trong Linux libc. Linux libc. Việc hiện thực này xoay quanh việc gọi một là Việc hiện thực này xoay quanh việc gọi một là syscall().syscall(). . có close() xuất hiện 2 lần: một trong libc và một trong chương trình của ta. Giá trị trả về của trong chương trình của ta. Giá trị trả về của syscall() hay syscall macro là syscall() hay syscall