Unix và lập trình C - Phần 1: Unix cơ sở
Bật công tắc nguồn của terminal (trong hệ thống của NLC là Xterm sau khi dùng
Exceed kết nối với UNIX server), khoảng một giây sau trên màn hình hiện dòng thông
báo:
Login:
Hãy nhập vào tên (user name) khi kết thúc bằng phím Enter. Nếu người sử dụng có
dùng mật khẩu (passwor), trên màn hình sẽ hiện dòng:
Password:
Hãy vào mật khẩu của mình và kết thúc bằng phím Enter.
Nếu tên (và mật khẩu nếu có) được vào đúng, terminal đó sẽ được nối với máy chủ và
trên màn hình sẽ hiện ký tự: $ đó là dấu nhắc của Shell.
Mật khẩu đảm bảo an toàn cho mỗi phiên làm việc. Ta có thể thay đổi mật khẩu bằng
lệnh passwd. Mật khẩu phải dài ít nhất 6 ký tự, ít nhất phải có 2 ký tự alphabet, phải
khác với tên (user name) ít nhất 3 ký tự, dài tối đa 13 ký tự.
Bạn đang xem 20 trang mẫu của tài liệu "Unix và lập trình C - Phần 1: Unix cơ sở", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Unix và lập trình C - Phần 1: Unix cơ sở
Copyright(c) by Galaxy CD – 1 Mục lục: PHẦN 1: UNIX CƠ SỞ Bài 1. Khởi động UNIX 1.1 Bắt đầu phiên làm việc 1.2 Kết thúc phiên làm việc 1.3 Cách dùng lệnh của UNIX Bài 2. Làm việc với file. 2.1 Tổ chức file 2.2 Di chuyển giữa các thư mục 2.3 Các thao tác cơ sở với các thư mục 2.4 Các thao tác cơ sở với file thường Bài 3. Bảo vệ các file của người sử dụng 3.1 Mô tả người sử dụng 3.2 Mô tả nhóm người sử dụng 3.3 Bảo vệ các file và các thư mục Bài 4. Sao, chuyển, liên kết và tìm kiếm file 4.1 Sao chép file 4.2 Chuyển và đổi tên file 4.3 Tạo liên kết với file 4.4 Tìm kiếm file Bài 5. Thông tin giữa những người sử dụng 5.1 Thông tin bằng lệnh mail 5.2 Thông tin bằng lệnh write Bài 6. Sử dụng chương trình soạn thảo vi 6.1 Khởi động vi 6.2 Soạn thảo văn bản Bài 7. Shell script 7.1 Quản lý tiến trình 7.2 Lập cách thức cho shell script 7.3 Các shell UNIX Bài 8. Đổi hướng (redirection) 8.1 Vào/ra chuan 8.2 Chuyển đổi dữ liệu giữa các tiến trình Copyright(c) by Galaxy CD – 2 8.3 Đổi hướng kép đầu ra chuẩn Bài 9. Cơ chế thay thế của Shell 9.1 Truyền tham số 9.2 Các biến Shell 9.3 Các kí tự đặc biệt 9.4 Lấy kết quả của một lệnh 9.5 Các qui tắc thay thế của Shell Bài 10. Môi trường của Shell 10.1 Môi trường 10.2 Các biến định nghĩa trước 10.3 Các biến chung Bài 11. Lập trình mức cơ sở dưới UNIX 11.1 Các phép thử trong Shell 11.2 Lập trình một cấu trúc có điều kiện 11.3 Lập trình một chu trình Bài 12. Tín hiệu và đồng bộ 12.1 Quản lý các tín hiệu 12.2 Quản lý các tiến trình 12.3 Đệ qui PHẦN 2 LẬP TRÌNH C DƯỚI UNIX Bài 1. Giới thiệu chung 1.1 Các lời gọi hệ thống 1.2 Chủ thực và chủ thực quyền của tiến trình 1.3 Định nghĩa các tham biến chương trình 1.4 Một số định nghĩa khác Bài 2. Quản lý tiến trình 2.1 Nhận biết tiến trình 2.2 Nhận biết chủ tiến trình 2.3 Thay đổi chủ và nhóm chủ 2.4 Tạo một tiến trình 2.5 Các hàm gọi một tiến trình thay thế 2.6 Đồng bộ tiến trình 2.7 Mức ưu tiên của tiến trình 2.8 Nhóm các tiến trình Copyright(c) by Galaxy CD – 3 Bài 3. Quản lý file 3.1 Mở một file 3.2 Tạo một file 3.3 Đóng file 3.4 Đặt mặt nạ các quyền thâm nhập file 3.5 Đọc file 3.6 Ghi file 3.7 Di chuyển con trỏ file 3.8 Cấu trúc một inode 3.9 Tạo một inode 3.10 Thay đổi quyền thâm nhập 3.11 Thay đổi chủ sở hữu hoặc nhóm 3.12 Thay đổi thư mục làm việc Copyright(c) by Galaxy CD – 4 PHẦN 1: UNIX CƠ SỞ Bài 1. Khởi động UNIX Nội dung: Làm quen với hệ điều hành UNIX. Bắt đầu, kết thúc phiên làm việc, chạy một số lệnh đặc trưng. 1.1 Bắt đầu phiên làm việc: Bật công tắc nguồn của terminal (trong hệ thống của NLC là Xterm sau khi dùng Exceed kết nối với UNIX server), khoảng một giây sau trên màn hình hiện dòng thông báo: Login: Hãy nhập vào tên (user name) khi kết thúc bằng phím Enter. Nếu người sử dụng có dùng mật khẩu (passwor), trên màn hình sẽ hiện dòng: Password: Hãy vào mật khẩu của mình và kết thúc bằng phím Enter. Nếu tên (và mật khẩu nếu có) được vào đúng, terminal đó sẽ được nối với máy chủ và trên màn hình sẽ hiện ký tự: $ đó là dấu nhắc của Shell. Mật khẩu đảm bảo an toàn cho mỗi phiên làm việc. Ta có thể thay đổi mật khẩu bằng lệnh passwd. Mật khẩu phải dài ít nhất 6 ký tự, ít nhất phải có 2 ký tự alphabet, phải khác với tên (user name) ít nhất 3 ký tự, dài tối đa 13 ký tự. 1.2 Kết thúc phiên làm việc: Ấn CTRL + D (giữ phím CTRL và gõ phím D) hoặc gõ lệnh $exit để kết thúc phiên làm việc. 1.4 Cách dùng lệnh của UNIX: - Cú pháp cơ bản để chạy một lệnh của UNIX như sau: $tênlệnh [-tuỳ chọn][đối số 1][đối số n] Thí dụ: wc là lệnh đếm và hiển thị số dòng, từ và ký tự của một file. Ta có thể chạy lệnh wc như sau $wc /etc/passwd 32 37 1139 etc/passwd $wc -l /etc/passwd 32 etc/passwd Copyright(c) by Galaxy CD – 5 $wc -ld /etc/passwd /etc/group 32 1139 etc/passwd 15 337 etc/group 47 1476 total - Các thông báo lỗi khi gọi lệnh: Nếu lệnh không tồn tại hoặc không tìm thấy: $data data not found Nếu cú pháp của lệnh bị gõ sai: $wc -m /etc/group usage: wc [-clw][name] Bài tập: Chú ý: Ký hiệu tượng trưng cho việc gõ phím Enter. 1. Hãy bắt đầu phiên làm việc với tên (username) của bạn. 2. Đợi khi dấu nhắc của hệ thống xuất hiện (dấu $), gõ vào date 3. Gán mật khẩu cho tên: passwd 4. Liệt kê tên những người đang sử dụng hệ who 5. Xem ai là người đang làm việc tại terminal: who am I whoami 6. Xem tên terminal mà ta đang làm việc trên đó: tty 7. Hiển thị các thông báo lên màn hình: echo “Xin chao” echo “Chao” echo “Dau nhac ket thuc boi $ xuat hien sau Chao” echo “Hom nay la ngay:”;date echo “Hai lenh tren 1 dong cach nhau boi dau ;” 8. Dùng lệnh cal (lịch): cal 01 1900 cal 01 cal 1900 cal 1900 | more 9. Một vài lệnh khác: logname Copyright(c) by Galaxy CD – 6 uname who | wc 10. Kết thúc phiên làm việc: Ctrl D (giữ phím Ctrl và gõ D) hoặc exit Copyright(c) by Galaxy CD – 7 Bài 2. Làm việc với file Nội dung: Các khái niệm cơ bản về file của UNIX, tổ chức của các file trên đĩa, các thao tác với file. 2.1 Tổ chức file: 2.1.1 Các kiểu file UNIX có 3 kiểu file: -File bình thường (ordinary file): là một tập hợp thông tin (ASCII text hoặc binary). -File thư mục (directory file): chứa danh sách các têncó thể truy nhập tới thí dụ như các file bình thường, các file đặc biệt hoặc các thư mục con. -File đặc biệt (special file): là các file liên quan tới các thiết bị ngoại vi cứng và/hoặc cơ chế truyền tin. Thí dụ: Bàn phím là một file đầu vào(input file). Màn hình là một file đầu ra (output file). Máy in là một file đầu ra. 2.1.2 Tổ chức của các file Các file của UNIX được tổ chức theo dạng cây (tree). Thư mục gốc (root) của cây được biểu diễn bằng ký tự /. Cấu trúc cây cơ sở của hệ UNIX được bố trí như sau: Ký hiệu file bình thường Ký hiệu file thư mục Ký hiệu file đặc biệt Hình 1: Cấu trúc cây cơ sở của UNIX 2.2 Di chuyển giữa các thư mục: Để di chuyển giữa các thư mục trong cây của UNIX, ta dùng 2 lệnh sau đây: / unix bin etc usr users dev user2 user1 Copyright(c) by Galaxy CD – 8 cd chuyển đến thư mục cần đến (change directory) pwd hiển thị tên thư mục đang làm việc (print working directory) Tại thời điểm bắt đầu phiên làm việc, ta ở trong thư mục tiếp nhận (HOME directory). Muốn xem tên thư mục tiếp nhận này, ta dùng lệnh pwd. Thí dụ: user1 có thư mục tiếp nhận là /users/user1 $pwd /users/user1 Để di chuyển giữa các thư mục ta dùng lệnh cd với tên thư mục cần chuyển đến. $cd /usr/bin $pwd /usr/bin $cd .. $pwd /usr Để về thư mục tiếp nhận khi ta đang ở bất kỳ đâu, gõ: $cd $pwd /users/user1 2.3 Các thao tác cơ sở với thư mục: 2.3.1 Xem nội dung thư mục: - Xem nội dung thư mục hiện đang làm việc: $ls - Xem nội dung thư mục khác, chẳng hạn thư mục /bin: $ls /bin - Xem thêm thông tin của các file trong thư mục: $ls -l hoặc $ll - Xem tên các file trong thư mục theo cột: $lc Khi dùng lệnh ls –l ta có thể phân biệt các kiểu file bằng cách xem ký tự đầu của dòng hiển thị, nếu là: d : file thư mục. - : file bình thường c hoặc b : file đặc biệt 2.3.2 Tạo thư mục: Để tạo một thư mục mới, ta dùng lệnh mkdir (make directory): $mkdir index $cd index Copyright(c) by Galaxy CD – 9 $ls -a . . . Lệnh mkdir tạo một thư mục với 2 đầu vào (entry) - bản thân thư mục có tên đã cho. - thư mục . liên hệ với thư mục được tạo ở trên - thư mục . . liên hệ vơí thư mục cha. 2.3.3 Xóa thư mục: Để xoá một thư mục ta dùng lệnh rmdir (remove directory): $rmdir index Nếu muốn xoá thư mục không rỗng, phải dùng lệnh rm với tuỳ chọn r $rm -ri thumuc 2.4 Các thao tác cơ sở với file thường: 2.4.1 Nhận biết một file thường: Lệnh file phân tích nột dung của một file và hiển thị tính chất của thông tin chứa trong file: $file /etc/passwd /etc/passwd: ascii text $file /bin/ls /bin/ls: 680x0 executable 32 bits page aligned striped 2.4.2 Xem nội dung một file thường ASCII: Có thể dùng một trong các lệnh sau: cat dùng để xem nội dung các file nhỏ. pg hoặc more xem nội dung các file lớn theo trang. $cat tên file $pg tên file $more tên file 2.4.3 Tạo một file thường ASCII Tại Shell của UNIX ta có thể dễ dàng tạo một file thường ASCII text bằng cách dùng lệnh cat $cat >text_file abcdef 123456 $ Copyright(c) by Galaxy CD – 10 - Ký tự ‘>’ đổi hướng, thay vì đến đầu ra chuẩn (standard output) ‘ ‘ đến file được quy định ngay sau ‘>’. Ở đây các ký tự gõ vào được ghi vào file ‘text_file’. - Lệnh cat, nếu không có đối số (argument), sẽ coi bàn phím là đầu vào chuẩn. - Gõ tại dòng trống cuối cùng kết thúc việc vào số liệu. Stdin KEYBOARD FILE stdout CONSOLE stderr 2> Hình 2 : đổi hướng đầu vào/ra chuẩn Cách viết tên file khi tạo file: - độ dài + tên file của UNIX sys V dài tối đa 14 ký tự + tên file của BERKELEY, bắt đầu từ version BSD 4.2. có thể dài đến 256 ký tự. - không có sự hạn chế dùng ký tự nào khi viết tên file, song ta cần chú ý vài điểm sau: + không dùng các ký tự đặc biệt (trừ dấu chấm ‘.’ hoặc dấu gạch dưới ‘_’) vì phần lớn các ký tự đó được dùng trong cú pháp của lệnh Shell. + file có tên bắt đầu bằng dấu chấm ‘.’ là file ẩn (hidden). + ký tự viết thường khác với viết hoa. Viết tên file bằng cách dùng các metacharacter (? Và *) - ký tự ‘*’ thay thế một xâu ký tự - ký tự ‘?’ thay thế một ký tự Thí dụ: $ll /bin/c* $ll /bin/c? 2.4.4 Xoá một file thường: Lệnh : rm Có thể dùng lệnh rm với các tuỳ chọn sau: -i có hỏi đáp để khẳng định -f không có hỏi đáp. Tuỳ chọn này rất nguy hiểm, chỉ những người sử dụng có kinh nghiệm và cẩn thận mới nên dùng. $rm text_file $rm -i text_file cat Copyright(c) by Galaxy CD – 11 Bài tập: 1. Xem tên thư mục đang làm việc: pwd 2. Xem nội dung của thư mục đang làm việc: ls –l 3. Tạo file văn bản tintin: cat > tintin blabla BLABLA end CTRL + D (giữ phím Ctrl và gõ phím D) 4. Xem nội dung file tintin: cat tintin 5. Xem nội dung các thư mục /bin /usr/bin /dev ll /bin hoặc ls -C /bin hoặc ll /bin | pg 6. Tạo 2 thư mục d1 và d2 mkdir d1 d2 7. Chuyển thư mục làm việc đến d1 8. Tạo một file trong thư mục d1 9. Trở về thư mục tiếp nhận (HOME directory) cd 10. Xem nội dung thư mục đang làm việc: ls -l hoặc ll ls ll -R (xem nội dung cả các thư mục con) lc 11. Xoá thư mục d1: rm d1/* rmdir d1 Hoặc rm -ri d1 Copyright(c) by Galaxy CD – 12 Bài 3. Bảo vệ các file của người sử dụng: Nội dung : mô tả cơ chế bảo vệ file của UNIX : người sử dụng, nhóm người sử dụng, các quyền thâm nhập file 3.1 Mô tả người sử dụng: 3.1.1 Khái niệm: Một người sử dụng được mô tả bằng các thông tin sau: - tên - [mật khẩu (nếu có] - số nhận dạng (uid : user identify number) - số của nhóm (gid : group identify number) - [chú thích] - thư mục tiếp nhận (HOME directory) - [tên chương trình cho chạy lúc bắt đầu tên làm việc] Các thông tin trên được chứa trong file /etc/passwd 3.1.2 Lệnh defuser: Lệnh này ở trong danh mục /etc, nó cho phép: - hiển thị danh sách những người sử dụng. - thêm người sử dụng mới (chỉ những người quản trị hệ thống có quyền) $cat /etc/passwd | pg root : RKgSspHwm.PB.:0:3:0000-Admin000,,,:/: date::18:1::/:/bin/date tty::19:1::/:/bin/tty user1::3000:300::/users/user1: user2::3001:300::/users/user2: $/etc/defuser | pg USER UID GID HOMEDIR SHELL root 0 3 / daemon 1 12 / bin 2 2 /bin sys 3 3 /usr adm 4 4 /usr/adm date 18 1 / /bin/date tty 19 1 / /bin/tty sync 20 1 / /bin/sync securadm 11 11 /etc/secure/bin lp 71 2 /usr/spool/lp user1 3000 300 /users/user1 /bin/ksh Copyright(c) by Galaxy CD – 13 user2 3001 300 /users/user2 /bin/ksh 3.2 Mô tả nhóm người sử dụng 3.2.1 Khái niệm: Một nhóm người sử dụng là tập hợp của một số người sử dụng có thể dùng chung các file của nhau. Một nhóm người sử dụng được mô tả bằng các thông tin sau: - tên của nhóm - [mật khẩu] - số của nhóm (gid : group identify number) - [danh sách những người khách (guest)] Các thông tin trên được chứa trong file /etc/group 3.2.2 Lệnh defgrp: Lệnh này ở trong thư mục /etc, nó cho phép: - hiển thị danh sách các nhóm người sử dụng. - thêm nhóm mới (chỉ người quản trị hệ thống mới có quyền). $cat /etc/group public :: 100 : invite animator :: 200 : stagiaires :: 300 : $/etc/defgrp GRP GID USERS root 0 root other 1 date sync shut bin 2 root bin daemon lp sys 3 root bin sys adm adm 4 root adm daemon uucp 5 uucp daemon Copyright(c) by Galaxy CD – 14 nuucp mail 6 root 3.3 Bảo vệ các file và các thư mục 3.3.1 Các quyền thâm nhập file: Khi file được tạo lập, các thông tin sau đây đồng thời được ghi lại: - uid của người tạo file - gid của người tạo file - các quyền thâm nhập file File được bảo vệ bởi một tập hợpc các bit định nghĩa quyền thâm nhập: r w x r w x r w x suid sgid owner group other Trong đó: r quyền đọc w quyền ghi x quyền chạy (executing) suid set user-id sgid set group-id Đối với thư mục: r quyền đọc nội dung thư mục w quyền tạo và xoá file trong thư mục x quyền qua lại (crossing) thư mục Ghi chú: các quyền với thư mục chỉ có hiệu lực ... -eq bằng (equal to) -ne không bằng (not equal to) -gt lớn hơn (greater than) -ge lớn hơn hoặc bằng (greater or equal to) -lt nhỏ hơn (less than) -le nhỏ hơn hoặc bằng (less or equal to) Thí dụ: $test “$A” -eq “$B” true nếu giá trị của biến A bằng giá trị của biến B +Kiểm tra các xâu ký tự: [“str1” = “str2”] đúng nếu str1 bằng str2 test “str1” != “str2” đúng nếu str1 khác str2 test -z “$A” đúng nếu xâu $A rỗng test -n “$A” đúng nếu xâu $A không rỗng Thí dụ: $test “$LOGNAME” != “user1” +Kết hợp các điều kiện: Các toán tử so sánh có thể kết hợp với: -a và (and) -o hoặc (or) ! đảo (negation) \(\) gộp (grouping) Thí dụ: $test \(-r file1 -o -r file2 \) -a -w file3 đúng nếu: Copyright(c) by Galaxy CD – 53 - file1 và file2 tồn tại và chỉ đọc được và - file 3 tồn tại và ghi được. 11.2 Lập trình một cấu trúc có điều kiện: 11.2.1 Cấu trúc có điều kiện : a) if then else fi if command1 then command2 else command3 fi Giải thích: Nếu giá trị trả về sau khi thực hiện command1 là 0 (đúng) thì thực hiện command2, nếu không thì thực hiện command3 kết thúc Thí dụ: if test -f file1 then echo “file exists” else echo “file does not exist” fi Chú thích: không bắt buộc phải dùng else if [-w file1] then echo “message” >> file1 fi b) Cấu trúc lồng (nested) Ta có thể lồng các cấu trúc điều kiện với nhau. Khi đó: else if thành elif Thí dụ: if test -f file1 then echo “file exists” elif test -d file1 then echo “file is a directory” fi trong trường hợp này fi là chung. Chú ý: cú pháp sau cũng có thể dùng được: if then else if then Copyright(c) by Galaxy CD – 54 else fi c) Các toán tử | | và && Trong trường hợp điều kiện đơn giản, có thể dùng toán tử hoặc logic | |, hoặc toán tử và logic && để lập trình cấu trúc. command1 && command2 Nếu command1 được thực hiện tốt, thì thực hiện command2, nếu không thì ra. command1 | | command2 Nếu command1 được thực hiện tốt, thì ra, nếu không, thì thực hiện command2. Chú ý: có thể dùng dấu ngoặc đơn để gộp các lệnh Thí dụ: test -d demo && echo “demo is a directory” test -d demo | | echo “demo is not a directory” (test -d demo && ls -l demo) | | echo “demo not ok” 11.2.2 Rẽ nhánh trong phép chọn một trong nhiều giá trị: Dùng cấu trúc: case in esac Cấu trúc trên cho phép chọn một trong nhiều xâu ký tự và thực hiện các lệnh liên quan đến xâu đó. case $variable in string1) cmd1 cmd2 ;; string2) cmd1 cmd2 ;; string3 | string4) commands ;; esac Chú ý: có thể dùng các metacharacter của shell để biểu diễn xâu ký tự, | có nghĩa là hoặc 11.3 Lập trình một vòng lặp 11.3.1 Vòng lặp for a) Cấu trúc: for in do done Cấu trúc này của for cho phép thực hiện một chuỗi lệnh như nhau với mỗi một giá trị trong danh sách đã cho. Số các vòng lặp bằng số các giá trị trong danh sách. for variable in val1 val2 val3 Copyright(c) by Galaxy CD – 55 do command1 command2 command3 done Với variable có thể gán được các giá trị val1, val2 thực hiện các lệnh command1, command2, Thí dụ: WRITE là một shell_script gởi thông báo tới 3 người dùng user1, user2, user3: $cat WRITE for i in user1 user2 user3 do write $I < message_file done b) Cấu trúc : for do done Cấu trúc này cho phép thực hiện một chuỗi lệnh như nhau với các đối ($1 $2 ) của shell_script được gọi. for variable do command1 command2 command3 done Với variable có thể gán được các đối của shell_scipt thực hiện các lệnh command1, command2, Thí dụ: Shell_script copy sao chép các file trong danh sách đối vào danh mục /users/user8 và đổi nhóm thành nhóm student, đổi người sở hữu thành user8. $cat copy for i do if [-f $i] then cp $i /users/user8 chgrp student /users/user8/$i chown user8 /users/user8/$i fi done $ls -l total 10 -rw------- 1 phil animator 56 May 31 14:14:22 file1 -rw------- 1 phil animator 22 May 31 15:14:22 file2 $copy file1 file2 toto Copyright(c) by Galaxy CD – 56 toto is not a file $ls -l /users/user8 total 5 -rw------- 1 phil animator 56 May 31 14:14:22 file1 -rw------- 1 phil animator 22 May 31 15:14:22 file2 11.3.2 Vòng lặp while và until a ) while do done Vòng lặp while thực hiện một chuỗi lệnh khi điều kiện vẫn còn thoả mãn. while command1 do command2 command3 command4 done Khi giá trị trả về của việc thực hiện command1 vẫn thoả mãn điều kiện (true), shell thực hiện tiếp chuỗi lệnh giữa do done. Hai lệnh thường dùng trong vòng lặp while: true hoặc : cho giá trị true(0) sleep[n] đợi n giây Thí dụ: - shell_script param hiển thị tất cả các đối của lệnh. $cat param while test $# -ne 0 do echo $1 shift done - shell_script disp_time hiển thị số liệu ngày tháng theo khoảng thời gian 30 giây. $cat disp_time while true hoặc while : do date sleep 30 done b) until do done Vòng lặp until hoạt động ngược lại với vòng lặp while until command1 do command2 command3 command4 Copyright(c) by Galaxy CD – 57 done Khi giá trị trả về của việc thực hiện command1 vẫn không thoả mãn điều kiện (false), shell thực hiện chuỗi lệnh giữa dodone Lệnh false thường hay được dùng trong vòng lặp này để cho giá trị false. Thí dụ: vòng lặp until: - ta viết lại shell_script param ở trên: $cat param until test $# -eq 0 do echo $1 shift done c) các phép tính số học Lệnh let được dùng đẻ thực hiện các phép tính số học: Các toán tử có thể dùng gồm: + - * / % Thí dụ: $integer i=10 j=2 k l let “k=i+j” $echo $k 12 Chú ý: cú pháp let “k=i+j” tương đương với ((k=i+j)) hoặc k=i+j $((l=k*j)); echo $l 24 Lệnh let có thể dùng với các toán tử so sánh, kết quả được chứa trong biến $?. Các toán tử so sánh có thể dùng là: = == != Thí dụ: $((i<j));echo $? 1 Ta cũng có thể dùng các toán tử logic sau đây với let: ! && | | d) Lập trình một số đếm Lệnh expr cho phép ta thực hiện một thao tác có cú pháp như sau: $expr term1 operator term2 Các toán tử có thể dùng: cộng trừ nhân chia lấy số dư + - * / % Thí dụ: shell_script create_file tạo các file file1, file10 $cat create_file count=1 while test “$count” -le 10 Copyright(c) by Galaxy CD – 58 do >file$count count=expr $count+1 done $cat create_file2 integer count=1 while let “count <””10” do >file$count count=count+1 done 11.3.3 Ra khỏi một vòng lặp: Lệnh break cho phép ra khỏi các vòng lặp for, while, until. Thí dụ: shell_script stock ghi các dòng ký tự vào từ bàn phím lên file lines cho tới khi ta gõ từ “END”: $cat stock while true do echo “Enter your line:” read answer if test “$answer” = “END” then break else echo $answer >> lines fi done Chú ý: break[n] cho phép ra khỏi n mức của các vòng lặp lồng. 11.3.4 Bỏ qua phần tiếp theo trong một vòng lặp: Lệnh continue cho phép bỏ qua các lệnh còn lại, quay về đầu vòng lặp. Thí dụ: shell_script supprim xoá tất cả các file có trong danh sách đối, trừ file save và source: $cat supprim set -x for i do if test “$i” = “save” -o “$i” = “source” then continue fi echo $i rm $i done $cd appli $lc titi save source toto Copyright(c) by Galaxy CD – 59 $supprim * + test titi = save -o titi = source + echo titi titi + rm titi + test save = save -o save = source + continue + test source = save -o source = source + continue + test toto = save -o toto = source + echo toto toto + rm toto $lc save source Bài tập: 1. Dùng các cấu trúc và rẽ nhánh viết các shell_script sau: a) writemail message userX Chức năng: - gởi thông báo trực tiếp cho userX - nếu người đó không đang trong phiên làm việc, gởi vào hộp thư. Gợi ý: dùng lệnh write, mail, | | b) fileread filename Chức năng: - kiểm tra đối có phải là file hay không - nếu đúng, kiểm tra có phải là file chỉ đọc (readonly) không - hiện các thông báo tương ứng kết quả c) filesort file1 file2 Chức năng: - đọc một dòng từ bàn phím và ghi lên file theo cách sau: + vào cuối file1 nếu dòng chứa ít nhất một chữ (letter) + vào cuối file2 nếu dòng chứa ít nhất một số (number) và không chứa bất kỳ một chữ. + vào file không (null) nếu khác hai loại trên - kiểm tra số các đối, nếu khác 2, hiển thị thông báo: “command: filesort file1 file2” Gợi ý: dùng các lệnh case, read và các metacharacter 2. Sử dụng các vòng lặp đã học, viết các shell_script sau: a) testdir Chức năng: hiển thị danh sách các thư mục con trong thư mục làm việc. Copyright(c) by Galaxy CD – 60 Gợi ý: dùng các lệnh pwd, for, test b) mkfiles prefix n Chức năng: -tạo n file rỗng (ngầm định là 5) với tên prefix.n (thí dụ: file.1, file.2, file.3 với prefix=file và n=3) - hiện dòng khẳng định tạo file “prefix.n” hay không trong vòng lặp. Gợi ý: dùng if, while, test, read, expr Copyright(c) by Galaxy CD – 61 Bài 12 Tín hiệu và đồng bộ Nội dung: Các tín hiệu của hệ thống, cách dùng tín hiệu để điều khiển và đồng bộ các tiến trình. 12.1 Quản lý các tín hiệu: 12.1.1 Các tín hiệu: Trong khi thực hiện một shell_script, các tín hiệu sau có thể phát sinh: signal 0 ra khỏi shell (exit of the shell) signal 1 cắt liên lạc với terminal (disconnection) signal 2 Ngắt (thí dụ phím DEL) signal 3 Quit (Ctrl |) signal 9 Diệt tiến trình (Kill process) signal 10 Kết thúc logic một tiến trình Trong một chương trình ứng dụng, bằng cách dùng lệnh trap, ta có thể định nghĩa việc cần xử lý khi một tín hiệu phát sinh. Lệnh này cho phép gán một công việc xử lý cho bất cứ một tín hiệu nào. 12.1.2 Lập trình phím DEL Lệnh trap không đối liệt kê danh sách các tính hiệu và các việc xử lý tương ứng. $trap Cú pháp gán một công việc xử lý cho phím DEL: $trap ‘các lệnh’ 2 Xóa bỏ tác dụng phím DEL: $trap ‘’ 2 Gán chức năng ngầm định (default) cho phím DEL: $trap 2 Thí dụ: shell_script uncount hiển thị 5 4 3 2 1 trong các khoảng thời gian 5 giây, nếu ta gõ phím DEL, hiển thị chữ số tiếp. $/Icat/ i uncount trap ‘continue’ 2 for i in 5 4 3 2 1 do echo $i sleep 5 done 12.2 Quản lý các tiến trình 12.2.1 Chạy ngầm (background) một tiến trình Một tiến trình sẽ chạy ngầmnếu ta thêm ký tự & vào sau tên nó khi gọi. Số của tiến trình (PID) sẽ được hiển thị trên màn hình. Thí dụ: chạy shell_script uncount ngầm: Copyright(c) by Galaxy CD – 62 $uncount& [1] 467 Chú ý: - sau khi cho một tiến trình chạy ngầm, ta lại có thể dùng terminal làm việc khác. - không có thông báo khi tiến trình ngầm kết thúc, do đó khi chạy shell_script ta có thể cho thêm thông báo kết thúc: $(command; echo “END”)& - số PID của tiến trình ngầm trong biến $! - Có thể đổi hướng vào/ra (i/o) của tiến trình ngầm, tránh nhiễu màn hình khi ta làm việc khác. 12.2.2 Quản lý các tiến trình ngầm (job control) Lệnh: $set -m cho phép quản lý các tiến trình đang chạy ngầm. Thí dụ: $proc1 >> file1 & [1] 478 $proc2 & [2] 481 $proc3 & [3] 490 Hiển thị trạng thái của các tiến trình ngầm: $jobs -l [3] +490 running proc3 & [2] -481 done proc2 [1] 478 running proc1 >> file1 & trong đó: [n] số thứ tự tiến trình + tiến trình chạy cuối cùng - tiến trình trước tiến trình cuối 490 số PID của tiến trình running tiến trình đang thực hiện done tiến trình đã kết thúc proc3 & tên lệnh gọi 12.2.3 Tiếp tục tiến trình sau khi kết thúc phiên làm việc: Ta có thể cho tiếp tục thực hiện các tiến trình ngầm sau khi cắt liên lạc với terminal bằng cách dùng lệnh nohup. Các số liệu của tiến trình đưa ra stdout và stderr sẽ được ghi lên file nohup.out Thí dụ: $nohup uncount& Copyright(c) by Galaxy CD – 63 [1] 478 sending output to nohup.out $exit 12.2.4 Đợi kết thúc tiến trình Bằng cách dùng lệnh wait với đối số là PID của tiến trình: $wait 467 12.2.5 Diệt một tiến trình Dùng lệnh kill với đối số là PID của tiến trình: $kill 467 phát sinh tín hiệu 15 (ngầm định) $kill -9 467 phát sinh tín hiệu diệt tiến trình Ta cũng có thể diệt một tiến trình theo số thứ tự của nó trong danh sách các tiến trình đang chạy ngầm: kill %n Thí dụ: $kill %1 $jobs [1] + done(143) proc >> file1 & [3] + running uncount & $kill -9 %+ [3] + killed uncount & 12.3 Đệ quy Tất cả các shell_script đều có tính đệ quy (recursivity). Thí dụ: shell_script dir_tree hiển thị cây thư mục bắt đầu từ thư mục là đối của nó. $cat dir_tree if test -d $1 then echo $1 is a directory for j in $1/* do $0 $j #$0 tên shell_script done fi $dir_tree /usr /usr is a directory /usr/adm is a directory /usr/adm/acct is a directory /usr/adm/acct/fiscal is a directory /usr/adm/acct/nite is a directory /usr/adm/sa is a directory Copyright(c) by Galaxy CD – 64 /usr/bin is a directory Bài tập: 1. Hãy viết shell_script: LisFileDel file1 file2 Chức năng: - hiển thị nội dung các file có tên trong danh sách đối - tiếp tục gõ phím DEL, bỏ qua file đang hiển thị, bắt đầu file tiếp - khôi phục chức năng ngầm định của phím DEL khi kết thúc. Gợi ý: Dùng trap, continue, signal 2 2. Hãy viết shell_script: trap2 Chức năng: - thực hiện một vòng lặp hiển thị thông báo: “Shutdown in n minutes” n có giá trị từ 5 đến 1 - mỗi khi gõ phím DEL, lập tức hiển thị thông báo tiếp theo - xoá bỏ tác dụng của phím DEL trong phút cuối cùng - khôi phục chức năng ngầm định của phím DEL khi kết thúc Gợi ý: dùng trap, continue, for
File đính kèm:
- unix_va_lap_trinh_c_phan_1_unix_co_so.pdf