1. .: CÔNG NGHỆ LINUX :. Môn học: KHÓA 3 CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT QUA MẠNG ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN Giảng viên: TS. Tô Tuấn (Viện CNTT, BQP) Email: totuan4@yahoo.com Trợ lý kỹ thuật: Nguyễn Vạn Phúc, Vũ Mạnh Cường
2.
3.
4.
5.
6.
7.
8.
9.
10.
11. - Đối với người quản trị hệ thống, có thêm một số đường dẫn trỏ đến thư mục /sbin , /usr/sbin - Unix/Linux sử dụng dấu “ : ” để phân cách các đường dẫn trong biến môi trường PATH , trong khi MS-DOS dùng dấu “ ; ” - Ví dụ: PATH = /bin: /user/bin: /usr/local/bin:.:
15. - Sử dụng gcc (hoặc cc ) để biên dịch như sau: # gcc helloworld.c -o helloworld # ./helloworld Hello World #
16.
17.
18.
19.
20.
21.
22.
23.
24.
25. Ví dụ minh họa về thư viện liên kết trên Windows == ----- ----- ==
26.
27. - Các hàm trên được khai báo như sau: #include <dlfcn.h> void *dlopen (const char* lib_file, int mode); void *dlsym (void * handle, const char* funct_name); int dlclose (void *handle); - Hàm dlopen() yêu cầu đường dẫn lib_file tới thư viện “.so” cần nạp. - Hàm dlsym() yêu cầu con trỏ đến thư viện nạp và trả về trước đó bởi hàm dlopen() - Hàm dlclose() giải phóng thư viện trỏ đến bởi handle do dlopen() nạp trước đó - Tham khảo Ví dụ 4-6: program2.c
28.
29.
30.
31. - Thực tế, thư mục trong Linux được xem như một tập tin có thuộc tính “ d ”. Hình 5.1 Hệ thống thư mục trong Linux Đĩa cứng 1 Đĩa cứng 2 usr etc home dev minhkhai soft book.doc office helps.txt
34. Hình 5.2 Cách triệu gọi và truy xuất thiết bị phần cứng Ứng dụng (Application) stdio Library Lời gọi hệ thống (System Call) KERNEL Device Drivers Thiết bị phần cứng (Hardware Devices) gọi hàm Không gian người dùng (User Space) Không gian hệ thống (Kernel Space)
35.
36. 5.3.1. Đóng mở tập tin - Sử dụng hàm fopen() và fclose() - Ví dụ: /*Khai b á o c ác b iế n con tr ỏ t ới c ấ u tr ú c FILE*/ FILE * f_read; FILE * f_write; FILE * f_readwrite; FILE * f_append; /*M ở t ập tin data.txt để đọ c*/ f_read=fopen(“/home/ch12/data.txt”, “r”); if (!f_read) { /*Kh ô ng m ở đượ c t ập tin */ perror(“Khong mo duoc file de doc...”); exit (1); }
37. /* M ở t ập tin logfile trong th ư m ụ c hi ện h à nh để ghi. N ế u ch ưa có, t ập tin mới được tạo; N ế u đã có, n ội dung cũ bị xóa */ f_write=fopen(“logfile.txt”, “w”); /* M ở /usr/local/db/users để đọc và ghi */ f_readwrite=fopen(“/usr/local/db/users”, “rw”); /* M ở /var/adm/messages để nối thêm dữ liệu vào cuối */ f_append=fopen(“/var/adm/messages”, “a”); /* Đóng tập tin đang mở */ if (!fclose(f_readwrite)) { perror(“Khong the dong file duoc...”); exit (1); }
38. 5.3.2. Đọc từ tập tin - Sau khi mở tập tin và có con trỏ đến cấu trúc FILE, có thể thực hiện việc đọc dữ liệu bằng nhiều hàm thư viện. - Ví dụ: int c; char buf[200]; c=fgetc(f_read); // Đọc 1 ký tự hoặc được EOF if (fread(buf, 120, 1, f_read) != 1) { // Đọc 1 khối ký tự perror(“Không đọc được !”); } if (feof(f_read)){ printf(“Gặp EOF !”); }
39. 5.3.3. Ghi vào tập tin - Giả sử f_readwrite là con trỏ đến cấu trúc FILE đã được fopen() với chế độ ghi là “w”. - Ví dụ: int c; char buf[201]; // Ghi ký tự ‘a’ ra tập tin c=‘a’; fputc(f_readwrite); // Ghi một chuỗi ký tự ra tập tin strcpy(buf, “Hello World !”); fputs(buf, f_readwrite); // Đẩy dữ liệu còn lại trong vùng đệm ra tập tin fflush(f_readwrite);
40. 5.3.4. Di chuyển vị trí đọc/ghi trong tập tin - Dùng hàm fseek() phối hợp với ftell(). - Ví dụ: fseek(f_read, 20L, SEEK_SET); // Chuyển đến vị trí 20 fseek(f_read, 10L, SEEK_CUR); // Đi 10 vị trí tính từ vị trí hiện thời // Ghi nhớ vị trí hiện thời. Chuyển đến vị trí cách cuối file 50 byte // Ghi chuỗi Hello World ! kể từ vị trí đó, sau đó về chỗ cũ long old_position=ftell(f_readwrite); if (fseek(f_readwrite, -50L, SEEK_END) < 0){ perror(“Không chuyển đến được !”); exit(1); } fputs(“Hello World !”, f_readwrite); fseek(f_readwrite, old_position, SEEK_SET) ;
41.
42.
43.
44.
45.
46.
47.
48.
49. 5.5. Xử lý thư mục Linux có các hàm riêng dùng để xử lý thư mục: #include <sys/types.h> #include <dirent.h> // Mở thư mục với kết quả là con trỏ tới cấu trúc DIR DIR *opendir(const char * name); // Đọc một đầu mục struct dirent readdir(DIR *dirp); // Đóng thư mục int closedir(DIR *dirp); // Vị trí hiện hành của con trỏ đầu mục long int telldir(DIR *dirp);
50.
51.
52.
53. 6.1. Đối số truyền cho chương trình 6.1.1. Phân tích đối số dòng lệnh Chuơng trình chính viết bằng C có thể chứa hàm main() với đặc tả: int main(int argc, char *argv[]) Đối số trên dòng lệnh thường dùng để truyền thông tin từ ngoài vào: # args –i –lrv ‘Hi Linux’ –f “/data/vb.txt” Chương trình sau in ra tất cả các giá trị đối số mà hàm main() nhận được:
54.
55. 6.1.2. Hàm getopt() Hữu ích cho việc phân tích đối số dòng lệnh. Ví dụ: getopt(argc, argv, “if:lr”); sẽ phân tích và xem –i, -l, -r, -f là các tùy chọn, trong đó –f có dữ liệu kèm theo. #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { int opt;
56. while ((opt = getopt(argc, argv, "if:lr")) != -1) { switch (opt) { case 'i': case 'l': case 'r': printf("option: %c", opt); break ; case 'f': printf("filename: %s", optarg); break ; case ':': printf("option needs a value"); break ;
58. 6.2. Biến môi trường Truy xuất và thiết lập biến môi trường bằng các hàm: #include <stdlib.h> char *getenv(const char *name); int putenv(const char *string); Trong đó, name chứa tên biến môi trường cần truy xuất, string chứa chuỗi theo mẫu: varname=value
59. 6.3. Thời gian và ngày tháng - Lấy về giá trị thời gian ở cấp thấp (số giây kể từ 0 giờ 1970) bằng hàm time(): #include <time.h> time_t time(time_t *loc); Trong đó, loc là tham biến dùng nhận kết quả trả về của hàm - So sánh giữa 2 thời điểm bằng hàm difftime(): #include <time.h> double difftime(time_t time1, time_t time2);
60. - Hàm gmtime() dùng truy xuất ngày/tháng/năm và giờ cụ thể: #include <time.h> struct tm *gmtime(const time_t timeval); Ví dụ: #include <time.h> #include <stdio.h> int main() { struct tm *tm_ptr; time_t the_time;