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ự.

 

pdf 65 trang dienloan 4900
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ở

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:

  • pdfunix_va_lap_trinh_c_phan_1_unix_co_so.pdf