Bài Giảng - Cô Tiên - Full

Màu nền
Font chữ
Font size
Chiều cao dòng

CHƯƠNG 0 - GIỚI THIỆU LINUX

CHƯƠNG 1 - CÀI ĐẶT LINUX

Chương 1 - Cài đặt và sử dụng Ubuntu

CHƯƠNG 2 - LINUX COMMANDS  

CHƯƠNG 3 - LẬP TRÌNH SHELL LINUX  

CHƯƠNG 4 - CÀI ĐẶT PHẦN MỀM TRÊN LINUX  

CHƯƠNG 5 - CÀI ĐẶT TIẾNG VIỆT TRÊN LINUX  

CHƯƠNG 6 - LẬP TRÌNH C TRÊN LINUX  

CHƯƠNG 7 - LẬP TRÌNH NÂNG CAO TRÊN LINUX 

CHƯƠNG 0 - GIỚI THIỆU LINUX

I - Giới thiệu Linux
 1. Khái niệm về Linux
–  Linux là nhân (kernel) của một hệ điều hành có thể thực thi trên nhiều loại máy tính khác nhau.
–  Là một phần mềm cung cấp sự giao tiếp giữa các dòng lệnh (hoặc chương trình) với phần cứng của máy tính.
 2. Lịch sử ra đời
–  Năm 1967, hãng AT & T đã giới thiệu HĐH mạng UNIX.
–  Phiên bản đầu tiên của Linux : tháng 8/1991.
–  Tác giả : Linus Torvalds (Đại Học Helsinki)
–   Ý tưởng của HĐH Linux là từ UNIX
–  Phiên bản chính thức : 05/10/1991.
–  Linux là một nhân bản của hệ điều hành UNIX
 3 Giới thiệu một sô phiên bản Linux
– Redhat Linux 8.0, 9.0
– VietKeyLinux
– SuSE Linux
– HongKyLinux
– Mandrake Linux
– Fedora Linux 9.0, 10.0
– Ubultu
 4. Đặc trưng của hệ điều hành Linux
–    Mã nguồn mở (open source), miễn phí
–    Tương thích với nhiều phần cứng
–    Tương thích với nhiều phần mềm
–    Dễ cấu hình.
–    Đa nhiệm (mutitasking).
–     Đa xử lý (multi processor suport)
–     Đa người dùng (multiuser)
–     Độc lập với thiết bị
–     Hệ thống quản lý bộ nhớ gọi trang theo yêu cầu.
–     Các thư viện động và dùng chung.
–     Quản lý tốt các hệ thống file.
–     Hỗ trợ truyền thông trên mạng
–    Bảo mật cao
–    Ổn định
–    Giao diện đồ hoạ thân thiện
–    Hỗ trợ nhiều ngôn ngữ lập trình
–    Cung cấp các ứng dụng máy chủ
–    Có khả năng kiểm soát lỗi


II- Tiện ích và hạn chế của Linux
 1. Các tiện ích máy chủ Linux
– Quản lý người sử dụng
– Quản lý tài nguyên máy, hệ thống file, . . .
– Cấu hình / quản trị dịch vụ tên miền DNS
– Cấu hình / quản trị dịch vụ máy chủ lưu động (DHCP)
– Cấu  hình  /  quản  trị  dịch  vụ  định  tuyến (Routing)
– Cấu hình / quản trị dịch vụ thư điện tử (SendMail)
– Cấu  hình  /  quản  trị  các  dịch  vụ  Web (Apache)
– Cấu hình / quản trị dịch vụ proxy (Squid)
– Thiết  lập  và  quản  trị  bức  tường  lửa (Firewall)
 2. Nhược điểm của Linux
– Đòi  hỏi  người  dùng  phải  thành  thạo  hệ thống.
– Tính tiêu chuẩn hóa: Tự do đóng gói, phân phối, nhiều bản Linux
– Hạn chế số lượng các ứng dụng chất lượng cao


III - Hệ thống tập tin và thư mục của Linux
 1. Hệ thống tập tin
–  Linux sử dụng hệ thống ext2 để lưu trữ dữ liệu và tên của tập tin, thư mục.
–  ext2 (Second extended File System) sử dụng một bảng i- node bao gồm một tập các nút để lưu thông tin và tên của tập tin, thư mục.
–  Mỗi tập tin hay thư mục đều được tham chiếu hay trỏ đến bởi một i-node.
–  Dữ liệu của tập tin được lưu trữ thành từng khối liền nhau.
–  Hệ thống ext2 bảo đảm cơ chế lưu trữ tập trung nên dữ liệu trên đĩa cứng không bị phân mảnh như  trong hệ thống DOS.
 2. Tổ chức thư mục
/
bin                       
boot
dev
var
sbin
root
etc
homemnt
usr
bin include
user01
user02
user03
user04
src
–  /bin : Chứa các file chương trình thực thi dạng nhị phân và file khởi động của hệ thống.
–  /boot : Thường chứa các file ảnh (image) của kernel dùng cho quá trình khởi động của hệ thống.
–  /lost+found : Chứa các chuỗi dữ liệu bị thất lạc trên đĩa cứng.
–  /mnt : Chứa các thư mục liên kết tạm thời đến các ổ đĩa hay các thiết bị khác.
–  /dev : Chứa các file đặc tả và liên kết đến các thiết bị ngoại vi của hệ thống.
Ví dụ : /dev/hda là ổ cứng, /dev/modem là modem.
–  /etc : Chứa các file cấu hình toàn cục của hệ thống, các file script để khởi động hay phục vụ cho mục đích cấu hình chương trình trước khi chạy.
 Ví dụ : /etc/passwd chứa cơ sở dữ liệu của người dùng, /etc/rc khởi tạo hệ thống tạm thời ban đầu,...
–  /sbin : Lưu trữ các tập tin nhị phân cần thiết của hệ thống, được sử dụng riêng cho người quản trị hệ thống.
–  /home : Chứa các thư mục home của người sử dụng.
–  /lib : Chứa các phần thư viện.so hoặc.a, các thư viện C và các thư viện liên kết động cần cho chương trình khi chạy và cho toàn hệ thống.
–  /proc : là một “virtual filesystem” được đặt trong bộ nhớ và  không  nằm  trên  đĩa.    Cho  phép  lấy  thông  tin  về chương trình và tiến trình nào đang hoạt động trên hệ thống ở một thời gian yêu cầu nào đó.
–  /tmp : Chứa các tập tin tạm phát sinh trong quá trình thực hiện chương trình.
–  /usr : Chứa một số thư mục con, các thư mục con này chứa hầu hết các chương trình quan trọng và tiện ích, ngoài ra còn có các tập tin cấu hình của hệ thống.
–  /var : Chứa các thư mục thường hay thay đổi kích thước.
 3. Các kiểu tập tin của Linux
Có 3 kiểu tập tin chính:
–  Normal file: Các tệp này thường là tệp văn bản hoặc tệp lệnh shell hoặc tệp dữ liệu thuần tuý
–  Directory file:  Thư mục là  một tệp  chứa các thông tin về những tệp có quan hệ trực tiếp với thư mục đó
–  Tệp đặc biệt: Đó là những tệp có quan hệ trực tiếp với các thiết bị ngoại vi bao gồm Link file, Named pipe, Device file: các tệp chứa thông tin của thiết bị, mỗi thiết bị thì có 1 file cấu hình cho nó.
 4. Cách đặt tên cho tập tin
–  Tên của các tệp là một chuỗi các ký tự khả hiện của ASCII.
–  Các  chữ  viết  hoa  được  phân  biệt  khác  các  chữ  viết thường.
–  Ký tự đầu tiên phải khác những ký tự sau đây để shell khỏi nhầm lẫn: + – =
–  Nói chung phải tránh dùng các ký tự đặc biệt.
–  Tên tệp UNIX System V dài tối đa 14 ký tự.
–  Tên tệp UNIX BSD dài tối đa 255 ký tự.
 5. Giới thiệu về bảng I-Node
–  Bảng i-node được đặt ở một nơi đặc biệt trên đĩa cứng gọi là super block.
–  Bảng i-node là một cấu trúc dữ liệu, là một bản ghi lưu trữ các thông tin
–  Các thông tin này gồm có các thuộc tính của các tệp.
–  Mỗi tệp của hệ thống tương ứng với một mục (entry) trong bảng
–  Mỗi  mục  này  ứng  với  một  số  i-node,  số  này chính là chỉ mục (index) của bảng. 
Bảng i-node chứa các thông tin sau:
–   i-node là số i-node
–  Type là kiểu tệp: thư mục, thiết bị,...
–  Quyền  truy  nhập:  Quyền  đọc,  ghi,  thực  hiện chương trình dành cho người dùng.
–  Liên kết: Các bí danh hoặc các tên khác của tệp này.
–  UID là số nhận dạng của người dùng (user) sở hữu tệp này.
–  GID  là  số  nhận  dạng  của  nhóm  người  dùng (group) sở hữu tệp này.
–  Ngày/giờ file được tạo: Thời điểm mục ứng với tệp này được tạo trong bảng i-node.
–  Ngày/giờ truy nhập nội dung tập tin
–  Ngày/giờ thay đổi nội dung tập tin
–  Kích thước : Kích thước của tập tin tính theo byte.
–  Vị trí của tập tin trên đĩa: Cấu trúc lưu trữ vị trí các khối thông tin trên đĩa nơi mà tệp được lưu trữ.
KẾT THÚC
CHƯƠNG 1 - CÀI ĐẶT LINUX


Nội dung
 I.   Các bước chuẩn bị cài đặt
 II.  Quá trình cài đặt
 III. Sử dụng Linux lần đầu


I-Các bước chuẩn bị
 1. Yêu cầu về phần cứng máy tính
–  Chip intel 386, 486,... và nhiều chip khác
–  Bus của hệ thống: ISA, EISA, PCI,...
–  Tối thiểu là 4MB Ram. Nếu muốn chạy ở chế độ đồ hoạ thì 64MB Ram
–  Đĩa cứng: Về nguyên tắc vẫn có thể sử dụng Linux ở ổ đĩa mềm, tuy nhiên nên cài đặt vào ổ cứng để sử dụng tiện hơn. Dung lượng cần thiết để cài đặt ở chế độ text là 80MB. Nếu cài để sử dụng chế độ đồ hoạ thì cần khoảng 1,8GB ->3,5GB.
–  Chấp nhận hầu hết tất cả các loại màn hình.
–  Ổ CD có giao tiếp SCSI 
 2. Dung lượng đĩa và bộ nhớ
Tuỳ theo từng chế độ cài đặt mà có các yêu cầu dung lượng đĩa khác nhau.
–   a. Personal Destop
Máy tính cá nhân với môi trường đồ hoạ thì cần khoảng 1.7GB, nếu chọn cả 2 giao diện GNOME và KDE thì cần khoảng 1.8GB
–   b. Workstation
Một bản làm việc máy trạm có sử dụng đồ hoạ, các công cụ làm việc thì cần khoảng 2.1GB, nếu sử dụng cả 2 chế độ đồ hoạ thì cần khoảng 2.2GB
–   c. Server
Một bản cài Server nếu không dùng đồ hoạ thì mất khoảng 850MB, nếu bản cài server lớn sẽ chiếm khoảng 1.5GB. Để sử dụng cả 2 chế độ đồ hoạ thì cần khoảng 5GB.
–   d. Custom
Một bản cài custom cần khoảng 450MB đến 5GB tuỳ theo mục đích cài đặt của người sử dụng.
 3. Những cách cài đặt Linux
 4. Phân vùng ổ đĩa
Cần ít nhất 2 phân vùng Root và swap
– swap: file hoán đổi, nó có chức năng giống với RAM, thông thường vùng này có kích cỡ gần gấp đôi dung lượng của RAM(<=32MB).
– Root (/): Nơi chứa các thư mục khác của Linux
 5. Chế độ cài đặt
– Cài theo kiểu Upgrade: Nâng cấp từ 1 phiên bản có sẵn của Linux, theo kiểu này sẽ lưu giữ các thông tin đã cài đặt trước đó của Linux.
– Cài theo kiểu Newinstall: Cài mới lại hệ thống 
 6. Các thông tin phần cứng

II- Quá trình cài đặt
 1. Terminal ảo
 2. Cài đặt từ CD-ROM
– Đặt đĩa CDROM chứa hệ điều hành Linux vào và khởi động lại máy
– Chờ hệ thống hiển thị màn hình boot, ấn 1 phím bất kỳ để boot từ CDROM
– Xuất hiện màn hình để check xem các đĩa cài đặt đã đảm bảo yêu cầu chưa
– Màn hình lựa chọn ngôn ngữ cài đặt
– Chọn bàn phím 
–   Có thể thay đổi kiểu bàn phím sau khi đã cài đặt xong bằng cách dùng công cụ Keyboard Configuration Tool.
– Gõ lệnh redhat-config-keyboard sau dấu nhắc shell để chạy công cụ Keyboard Configuration Tool.
– Nếu ta không truy cập với tên là root thì hệ thống sẽ yêu cầu ta nhập mật khẩu của root để tiếp tục.
– Chọn cấu hình chuột
– Nếu chuột của ta có bánh xe ở giữa, hãy chọn Generic - Wheel Mouse.
– Nếu ta có chuột kiểu PS/2, USB, hoặc Bus, ta không cần phải chọn cổng và thiết bị. Nếu chuột của ta là kiểu serial, hãy chọn đúng cổng và thiết bị mà chuột của ta đang nối vào
– Ô chọn Emulate 3 buttons cho phép ta sử dụng chuột có hai phím cũng như khi nó có ba phím bấm
–   Để thay đổi cấu hình chuột sau khi ta đã hoàn thành việc cài đặt, ta dùng Mouse Configuration Tool. Gõ lệnh redhat- config-mouse sau dấu nhắc shell để chạy Mouse Configuration Tool. 
– Phân vùng ổ cứng dùng công cụ Disk Druid hoặc đã phân vùng sẵn trước đó
– Cài đặt chương trình khởi động: Có thể chọn GRUID hoặc LILO. Có thể tạo 1 đĩa khởi động riêng hoặc đặt trình khởi động vào MBR.
– Thiết lập cấu hình mạng
– Thiết lập cấu hình TCP/IP
– Cấu hình FILEWALL
High
Medium
No Firewall:
Customize
– Thiết lập cấu hình thời gian: chọn time  zone phù   hợp   vị trí địa lý
– Thiết lập tài khoản người dùng
 3- Ghi chú
 3- Ghi chú


III- Bắt đầu sử dụng Linux
 Đăng nhập với tài khoản root
 giao diện ban đầu
 Cấu hình màn hình hiển thị
 4. Điều khiển
 5- Thêm hoặc gỡ ứng dụng 
Kết Thúc
Cài đặt và sử dụng Ubuntu


Nội dung

 Khái niệm Ubuntu

 Cài đặt.

 VMware 5.5

 Sử dụng.

 Các ứng dụng tiêu biểu.

 Ubuntu Tour


Khái niệm
 “Linux for Human Beings” – making Linux more available and easy to use.

 Là bản distro cho PC, dựa trên Debian

 Phổ biến (Popular).

 Dễ sử dụng (Usability).

 Phát triển liên tục (regular release).

 Dễ dàng trong cài đặt (ease of installation).


Các tiện ích

 Sử dụng môi trường Desktop GNOME, đơn giản, trực quan, hiệu quả.

 Số lượng lớn các phần mềm được sử dụng rộng rãi (OpenOffice,Firefox,GCC...).

 Thích hợp cho nguời dùng bắt đầu chuyển từ Windows sang Linux.

 Cộng đồng nguời dùng, hỗ trợ rộng rãi.


Các phiên bản

 OpenSource.

 Số lượng lớn các cộng đông phát triển trên các forum, mailling list chính thức.

 Cập nhật liên tục (version hiện tại là 10.04).

 Các phần mềm ứng dụng đươc phát triển liên tục.


Cài đặt

 Các trường hợp:

 Máy chưa có HDH

 Máy đã có HDH

 Cài song song 2 HDH

 Phân vùng ổ cứng.

 Cài đặt trên máy ảo VMWare.

 Download VMWare và cài đặt.

 Thiết lập thông số cho máy ảo.

 Cài đặt như trường hợp máy chưa có HDH.


Có thể dùng từ

 Download:

 ubuntu.com/getubuntu/download

 Cài đặt trực tiếp từ ổ cứng.

 Burn ra CD sau đó cài từ CD.

 Vmware

 http://www.vmware.com/download/


Giới thiệu VMware

 Virtual Machine Software

 Máy ảo chạy trên nền HDH

 Ex: Cài Linux trên máy ảo chạy trên nền Windows

Cấu hình VMware
Cấu hình VMware
Cấu hình VMware
Cấu hình VMware
Cấu hình VMware
Cấu hình VMware
Cấu hình VMware
Cấu hình VMware

Màn hình khởi động VMware

Cài đặt Ubuntu – Boot Screen
Cài đặt Ubuntu
Cài đặt Ubuntu
Cài đặt Ubuntu
Cài đặt Ubuntu
Cài đặt Ubuntu
 Chuẩn bị partition
Cài đặt Ubuntu
Cài đặt Ubuntu
Cài đặt Ubuntu

Ubuntu - Desktop

Ubuntu – Files System
Ubuntu – Files System
Ubuntu – Files System
Ubuntu – installing Software
Ubuntu – installing Software
Ubuntu – installing Software
Ubuntu – installing Software
Ubuntu – installing Software
Ubuntu – installing Software
Ubuntu – installing Software
Ubuntu – installing Software
http:// ubuntuguide.org


Popular Softwares

 OpenOffice – MS Office

 FireFox Browser – Internet Explore

 Gaim instant Messenger – Yahoo

 GIMP Image Editor – Photoshop

 Amarok Multimedia Player - WMP

 GCC Compiler

 Geany Editor – Visual C++ 2005

 PDF Reader – Adobe Acrobat Reader

 xCHM reader – MS CMH reader

 Stardict – All Dictionary

 .........

 No Virus

 VMware

 Wine – Can run a lot of Win's software Reference

 http://ubuntuguide.org/

 http://ubuntuforum.org

 http://ubuntu-vn.tuxfamily.org/

 http://www.vnlinux.org/

 http://groups.google.com/group/tuxs-spirit/
CHƯƠNG 2 - LINUX COMMANDS

Mục đích
 Cung cấp kiến thức về các tập lệnh của linux


Nội dung
 Một số chú ý
 Một số ký tự đặc biệt
 Một số câu lệnh khởi tạo
 Đặt tên cho hệ thống
 Quản lý user và group
 Bảo vệ và truy xuất tập tin
 Làm việc với tiến trình
 Lệnh làm việc với file và thư mục
 Lệnh làm việc với ổ đĩa
 Một số tiện ích
 Thêm hoặc gỡ package
 Lệnh về hệ thống


Một số chú ý
Linux có phân biệt chữ hoa và chữ thường
 Đường dẫn: linux sử dụng dấu /
– Vd: mkdir /home/user02
 File hiện hành: ./
– Vd: gedit ./test.txt
 Chương trình thực thi
– Không cần quy định phần mở rộng: .exe, com, .bat
– Gán thuộc tính cho nó là x(execute).
 Để trợ giúp câu


Một số ký tự đặc biệt
 * ? [ ]        Kí tự đại diện hay theo mẫu .
 &     Chạy ứng dụng ở chế độ nền , trả lại dấu nhắc hệ thống cho các tác vụ khác .
 ;      Dấu phân cách nhiều lệnh trên một dòng lệnh .
 \     Tắt tác dụng của những kí tự đặc biệt như *, ?, [ , ], &, ; , >, <, |
 ',,,'   Khi tham số là nhóm từ (có khoảng trống )
 "... "          Khi tham số có khoảng trống và các kí tự đặc biệt ngoại trừ kí tự $ và ‘
 >    Định hướng dữ liệu xuất ra file .
 <    Định hướng dữ liệu nhập từ file .
 >>  Định hướng dữ liệu xuất ra cuối file nếu file đã tồn tại .
 |     Định hướng dữ liệu xuất là dữ liệu nhập cho lệnh tiếp theo .
 '...'         Dấu huyền dữ liệu xuất của một lệnh làm tham số .
 $    Sử dụng biến môi trường .


Một số câu lệnh khởi tạo
 exit
– thoát khỏi hệ thống (Bourne-Shell)
 Logout
– thoát khỏi hệ thống C-Shell
 who
– cho biết những ai đang thâm nhập hệ thống
 man <Câu lệnh>: hiển thị chỉ dẫn thực hiện câu lệnh.


Đặt tên cho hệ thống
 Đặt tên cho hệ thống
 Để hiển thị tên của hệ thống: hostname
 Đặt tên mới:    hostname -S superduck
 Đặt tên cho hệ thống trong mạng
 hostname -S danang.com
 Tập tin chứa tên hệ thống
 /etc/hosts
 127.0.0.1 localhost


Quản lý user và group
 Để truy nhập và sử dung hệ thống Linux thì người sử dụng cần User và password để đăng nhập vào.
 Một số câu lệnh
–  useradd user02
–  userdel user02
–  groupadd group01
–  groupdel group01
–  chgrp group02
 $chgrp oracle /usr/database
 Thêm 1 tài khoản:
–  [root@localhost ~]#useradd user01
 Lệnh useradd có rất nhiều tham số khác nhau, để xem chi tiết dùng lệnh man useradd
 useradd user01 –g group01
–  [root@localhost ~]#passwd user01
 Changing password for user user01.
New UNIX password:
Sau đó nhập mật khẩu vào.Để chuyển sang user này dùng lệnh :
–  [root@localhost ~]#su user01
 Xóa 1 tài khoản:
– [root@localhost ~]# userdel user01
 Thêm 1 group vào hệ thống
– [root@localhost ~]#groupadd group01
 Xóa 1 group
– [root@localhost ~]#groupdel group01
 Thiết lập tài khoản người dùng
– Tập tin /etc/passwd chứa tất cả thông tin về tài khoản người dùng.
– Tập /etc/passwd thường được sở hữu bởi quyền root và thiết lập thuộc tính group ID là 0.
– Cấu trúc của các trường dữ liệu trong tập tin /etc/passwd:
username:password:user ID:group ID:comment:home directory:login command
 Ví dụ /etc/passwd:
 Mỗi dòng của tập tin /etc/passwd bao gồm 7 trường được phân cách bởi dấu :
 Nếu trường nào không có dữ liệu thì sẽ được để trống, nhưng vẫn giữ nguyên dấu phẩy ở sau để vẫn bảo đảm mỗi dòng sẽ có 7 trường.
–  password : mật khẩu người sử dụng (bảo mật).
–  user ID (UID) Số định danh xác đinh tài khoản người dùng trong hệ thống.
–  group ID (GID) Số định danh xác định nhóm người dùng.
–  comment dòng chú thích, thường là tên của người đăng nhập hệ thống, có thể là số điện thoài,…
–  home directory :Thư mục đăng nhập: thư mục mà khi người dùng sẽ làm việc khi đăng nhập vào hệ thống.
–  Lệnh login : dòng lệnh được thực thi khi người dùng đăng nhập vào hệ thống. Thông thường là câu lệnh để nạp 1 chương trình shell.
 Tạo 1 tài khoản người dùng:
–     1. Thêm 1 dòng vào tập tin /etc/passwd.
–     2. Tạo thư mục đăng nhập và thiết lập quyền sở hữu cho tài khoản.
–     3. Chép các tập tin shell khởi động và thiết lập lại các cài đặt về quyền sở hữu.
 Câu lệnh:  useradd or adduser
 Ví dụ tạo tài khoản: bill
–  Thêm dòng này vào tập tin /etc/passwd
 bill::103:50:Bill Smallwood:/home/bill:/bin/sh
–  Dùng câu lệnh sau để thiết lập mật khẩu cho tài khoản
 passwd bill
–  Bạn cần thêm một số câu lệnh sau:
 mkdir /home/bill
 chown bill /home/bill
Ngoài ra sẽ có một câu lệnh gedit /etc/passwd để gọi trình soạn thảo gedit và sủa đổi bản sao tạm thời của tập tin /etc/passwd.
 Cách khác: useradd bill
 Xóa tài khoản người dùng
–  Câu lệnh: deluser hay userdel
–  Xóa tài khoản thì có thể dùng cách sau:
 1. Xóa bỏ dòng có chứa tài khoản trong tập tin /etc/passwd và /etc/group.
 2. Xóa tập tin chứa nội dung mail của user bằng cách dùng. rm /usr/spool/mail/username
 3. gỡ bỏ các dịch vụ đang chạy.
 4. Xóa bỏ thư mục đăng nhập: rm -r /home/userdir
–  Nếu chỉ muốn vô hiệu hóa tạm thời tài khoản người dùng thì để dấu x trước trường mật khẩu và đừng sửa đổi bất cứ thông tin gì khác.
 Dùng chức năng Group
– Mỗi tài khoản trong Linux phải thuộc về 1 nhóm người sử dụng
– Tập tin /etc/group
 Mỗi dòng có 4 trường được phân cách bởi dấu hai cham (:)
–   group name:group password:group ID:users
 Thêm 1 Group:
–   Câu lệnh: addgroup hoặc groupadd
–   Hoặc thêm dòng mới vào tập tin /etc/group
 Ví dụ: accounts::51:bill, scanner::52:yvonne
 Thêm một tài khoản vào nhóm
–   Mỗi tài khoản trên một dòng trong tập tin /etc/group, được phân cách bởi dấu phẩy
–   Theo lý thuyết không có hạn chế về số tài khoản trong một nhóm nhưng trong thực tế mỗi dòng trong tập tin này nên chứa không quá 255 ký tự:
–   Ex: accounts::52:bill,yvonne,tim,roy,root
 Xóa 1 Group
– Bằng cách xóa 1 dòng trong tập tin /etc/group
– Câu lệnh    groupdel hay delgroup
 Cách dùng lệnh su
– Cú pháp:  su username
– Ví dụ:    su root


Bảo vệ và truy xuất tập tin
 Quyền hạn đối với tập tin và thư mục
 Hiểu các loại tập tin
 Hiểu các quyền truy xuất
 Vd: xem danh sách các file và quyền trên file:
– ls –l /home
 Với mỗi tập tin, có 3 nhóm quyền như sau:
              - rwx rwx rwx
 Ví dụ:
 ls –l bigfile
File
User
Group    other
 r-x rwx rw-  root  group01
 chmod: Thay đổi quyền truy cập
 Ví dụ: chmod u+w bigfile
 chmod go-x bigfile
 chmod ug+w o-x chapter*
 chown: thay đổi quyền sở hữu
– [root@localhost ~]#chown user01 text.txt
 chgrp: thay đổi nhóm sở hữu
– [root@localhost ~]#chgrp group01 text.txt
 Read(4), write(2), excute(1)
 #chmod 644 bigfile
– #ls –l:
– rw-r--r--
 #chmod 755 mydir
– #ls –l:
rwxr-xr-x


Làm việc với tiến trình
 Định hướng xuất nhập
– ls –l > log.txt
– ls –l >> log.txt
– more < log.txt
 ps: Xem thông tin tiến trình
– #ps –a
– Chú ý tham số PID
 Tiến trình foreground và tiến trình background
 Gọi 1 tiến trình dạng background
– Thêm dấu & vào sau câu lệnh
 #ls –R / >log.txt
 Tổ hợp phím ctrl Z: Tạm dừng tiến trình
 Đánh thức tiến trình:
– #jobs: xem các tiến trình đang dừng hay ở
background
– #bg num: gọi thực thi tiến trình ở
background
– #fg num: gọi thực thi tiến trình ở foreground
 Hủy tiến trình
– kill [level] PID
kill 598
kill -9 598
kill -15 598
 Giao tiếp giữa các tiến trình
– | Dùng cơ chế đường ống
– #ls –R | more
– ps –a | grep ‘[bash]’ here


Lệnh làm việc với file thư mục
 Lệnh về file, thư mục
– #cd : đổi thư mục
 cd /
 cd ..
– #cp –r source des: sao chép 2 thư mục
– #mkdir : tạo thư mục
– #rm –r tên thư mục : loại bỏ thư mục
– #rmdir tên thư mục rỗng
– #ls : liệt kê nội dung tập tin thư mục
– #mv source des: di chuyển thư mục
– #pwd: hiển thị thư mục hiện hành
 Lệnh về tập tin
–  more [-n] <danh sách các tập tin >
 trình bày nội dung tập tin. [-n] : chỉ định số dòng mỗi lần hiển thị là n dòng.
–  cp  <nguồn >  <đích >
 sao chép một hay nhiều tập tin.
–  find đườngdẫn  -name  têntậptin
 tìm vị trí của tập tin
–  grep <chuỗi cần tìm> <tên file>
 tìm vị trí của chuỗi ký tự trong tập tin
–  ls [tham số] tên thưc mục:
 trình bày tên và thuộc tính của các tập tin trong thư mục
 Lệnh về tập tin (tt)
–  mv <nguồn > <đích >
 di chuyển/đổi tên một tập tin
–  sort <tên tập tin>: sắp thứ tự nội dung tập tin
–  wc –l –c <tên tập tin>
 đếm số từ trong tập tin
–  cat <file>
 hiển thị nội dung một tập tin
–  cat <file1> <file 2> > <file3>
 Nối 2 tập tin
–  vi <filename>: soạn thảo hoặc sửa đổi nội dung tập tin
 gzip  <filename>
– nén một tập tin : Tên tập tin đã nén giống như tên ban đầu và kèm theo đuôi .gz
 gunzip  <filename>
– giải nén 1 tập tin
 ln [-s] <des> <short_cut>
– ln /usr/user01/testfile /usr/01/testfile
Tạo một link file dạng hard link
– ln -s /usr/user01/testfile /usr/01/testfile
Tạo một link file dạng soft link


Lệnh làm việc với ổ đĩa
 Mounting và Unmounting Filesystems
– Câu lệnh:
 mount [tham số] <tên_thiết_bị> <điểm_gắn_kết>
– vd:
 mount –t msdos /dev/sda4 /usr
 mount –t iso9660 /dev/cdrom /cdrom
– Có thể gắn kết tập tin với thuộc tính chỉ đọc:
 mount –t msdos /dev/hda1 /diskc -r
 Mount –t iso9660 /dev/cdrom /cdrom -r
 Vì sao phải umount
 Dùng câu lệnh: umount
 Ví dụ:
– umount /dev/cdrom
– umount /cdrom
 Tự động gắn kết hệ thống file bằng cách cài đặt thông tin trong tập tin: /etc/fstab
 Mỗi dòng trong
/etc/fstab có đinh dạng
sau:
device mount_location
filesystem_type options dump_frequency
pass_number
 Kiểm tra hệ thống tệp
– Dùng tiện ích fsck (filesystem check)
fsck /dev/sda1
fsck /usr
 df (disk filesystem) và du (disk usage)
– Hiển thị thông tin hệ thống tập tin


Một số tiện ích
 Date
– hiển thị và đặt ngày
 bc:
– tính biểu thức số học
 cal
– Lịch
 echo   <arg1>
 write/hello
– cho phép gửi dòng thông báo đến những người sử dụng trong hệ thống
 Clear
– Xoá màn hình .
 Time
– Hiển thị thời gian hiện hành của hệ thống

Thêm hoặc gỡ package
 Để install một package:
–  rpm -ivh <filename.rpm>
 Để upgrade một package:
–  rpm -Uvh <filename.rpm>
 Để uninstall một package:
–  rpm -e <filename.rpm>
 Để biết một package đ• được install hay chưa
–  rpm -q <filename.rpm>
 filename ở đây có thế là 1 file hoặc nhiều file với format rpm


Lệnh về hệ thống
 Top
–  Xem trạng thái về hệ thống và các process đang chạy tương tự như Task Manager trong Windows.
– Dừng ấn ctrl C
 shutdown -h now
– tắt máy tính
 shutdown -r now
– khởi động lại
 Thông số biến môi trường
– $PATH
 Sleep time: ngưng hoạt động một thời gian.
Kết thúc
CHƯƠNG 3 - LẬP TRÌNH SHELL LINUX


Mục đích
 Cung cấp kiến thức về lập trình shell linux


Nội dung
• Giải thích về shell Linux
• Cú pháp viết tập tin shell


Giới thiệu Shell Linux
•   Máy tính hiểu ngôn ngữ dưới dạng nhị phân.
•   Shell là chương trình thông dịch tiếp nhận các chỉ thị hoặc các lệnh và dịch ra ngôn ngữ máy dưới dạng nhị phân.
•   Shell diễn dịch các tham số dòng lệnh sau đó triệu gọi các hàm của hệ điều hành thực hiện một yêu cầu cụ thể nào đó.
•   Shell thực hiện chuyển đổi các lệnh của người sử dụng thành các lệnh đối với hệ điều hành.


Quá trình thực hiện của Shell
Your command Or Shell Script

Linux Shell
Converted to Binary language by Shell
Now Linux kernel understand your request


Các loại Shell
sh
csh, tcsh, zsh
bash
(Bourne shell) shell nguyên thủy áp dụng cho unix
(C Shell, Z shell) shell sử dụng cấu trúc của C làm ngôn ngữ kịch bản.
(Bourne Again shell) shell chủ yếu của Linux.
rc           Shell mở rộng của csh với nhiều tương thích với ngôn ngữ C hơn.
shell script : Kịch bản cho phép thực hiện một dãy lệnh liên tiếp. Tương tự tập tin bó (batch file) trong MS-DOS.


Tạo Shell script ?
•   Chương trình shell là một tập tin văn bản chứa một số lệnh shell hoặc lệnh của Linux.
•   Chương trình Shell cho phép tự động hóa một công việc , hoặc viết các ứng dụng tương tác đơn giản.
•   Tập tin shell : *.sh. Dùng lệnh cat file.sh hoặc vi file.sh hoặc gedit file.sh để soạn thảo tập tin Shell. (có thể dùng những chương trình soạn thảo khác: emacs,…)


script file
Chương trình shell remount.sh cho phép tự động kết nối lại ổ đĩa CDROM :
#!/bin/sh
umount /dev/cdrom
mount /dev/cdrom /cdrom
exit 0
•   Chú thích trong shell thường bắt đầu bằng ký tự #.
•   #!/bin/sh : chỉ thị yêu cầu shell hiện tại triệu gọi shell sh nằm trong thư mục bin.
•   Shell sh sẽ chịu trách nhiệm thông dịch các lệnh nằm trong tập tin script.
•   #! còn được dùng để triệu gọi một chương trình shell khác mà NSD muốn chạy trước khi script tiếp theo được diễn dịch.
•   exit 0 – script thực thi thành công và thoát khỏi shell sh đã gọi nó


Thực thi shell script
$gedit vidu.sh
#!/bin/bash
echo "Vi du shell"
a=10
b='expr $a + 5' echo "Tong = $b" exit 0
•   Cách 1 :       $chmod u+x vidu.sh
$./vidu.sh
•   Cách 2 :       $/bin/bash ./vidu.sh


CÚ PHÁP NGÔN NGỮ SHELL
Gồm những vấn đề chính sau:
•Biến:kiểu chuỗi, kiểu số, tham số, biến môi trường
•Điều kiện: kiễm tra để trả về true hoặc false
•Cấu trúc điều khiển chương trình:if, elif, for, while, until, case
•Danh sách
•Hàm
•Các lệnh nội tại của shell
•Lấy về kết quả của 1 lệnh


Dùng biến
•   Shell không cần phải khai báo biến trước khi sử dụng. Biến sẽ được tự động tạo ra và khai báo khi lần đầu tiên biến xuất hiện như trong phép gán.
•   Mặc định tất cả các biến đều nhận giá trị kiểu chuỗi (String).
•   Shell phân biệt chữ hoa chữ  thường. Thông thường tham số dòng lệnh thường cách nhau bằng khoảng trắng.
•   Nếu tham số chứa cả khoảng trắng (ký tự spacebar, tab hoặc ký tự xuống dòng) thì phải bọc trong cặp nháy đơn ' ' hoặc nháy kép " "
•   Lấy về nội dung của biến : $varname
•   Khi gán nội dung cho biến varname=value
  Lưu ý sau dấu = không được có khoảng trắng.
•   Hiển thị nội dung biến : echo $varname
•   Đọc dữ liệu nhập vào : read varname
#!/bin/sh
x=5
y=10
echo “gia tri cua x la: $x”
echo “gia tri cua y la: $y”
echo “hay nhap mot chuoi tu ban phim”
read input
echo “chuoi ban vua nhap la: $input”
exit 0


Biến môi trường
Khi khởi động shell cung cấp một số biến được khai báo và gán giá trị mặc định gọi là biến môi trường.
$HOME    chứa nội dung của thư mục.
$PATH      chứa danh sách các đường dẫn.
$PS1          dấu nhắc hiển thị trên dòng lệnh ($)
$PS2          dấu nhắc hiển thị trên dòng lệnh (>)
$IFS          dấu phân cách các trường trong danh sách chuỗi.
$0               chứa tên chương trình gọi trên dòng lệnh.
$#               Số tham số truyền trên dòng lệnh.
•   Mỗi môi trường đăng nhập chứa một số danh sách biến môi trường dùng cho mục đích riêng.
•   Có thể xem danh sách này bằng lệnh evn
•   Để tạo một biến môi trường mới có thể dùng lệnh export
•   Sử dụng lệnh exit trước khi kết thúc chương trình shell.


Biến tham số (parameter variable)
Dùng để nhận tham số trên dòng lệnh
$1, $2, $3, . . .     : vị trí và nội các tham số trên dòng lệnh theo thứ tự từ trái sang phải
$0     : từ đầu tiên của lệnh được gõ, là tên chương trình shell
$*     : các tham số trên dòng lệnh được lưu thành 1 chuỗi được phân cách bằng ký tự đầu tiên qui định trong IFS
"$@"        : lưu danh sách các tham số dòng lệnh thành chuỗi, không sử dụng phân cách của biến IFS
$#     : Tổng số tham số trên dòng lệnh.
$?     : Lưu mã trả về của lệnh cuối cùng được thực hiện.


Toán tử số học
Operator
Operation
+                  (Addition) Phép cộng
-                   (Subtraction) Phép trừ
/                   (Division) Phép chia
%                  Modulus Operator (Remainder)
Phép chia lấy dư
\* , *
(Multiplication) Phép nhân
Định lượng giá trị biểu thức
•   Lệnh expr được dùng trong việc tính toán các kết quả toán học đổi giá trị từ chuỗi sang số.
•   Ví dụ : 
x="14"
x='expr $x + 1'  
kết quả x = 15
•   Trong các lệnh shell sau, có thể dùng $((…)) thay cho lệnh expr.
x=$(($x + 1))
Ví dụ :
#!/bin/sh y=0
while [“$y” -le 15 ]; do
echo $y y=$(($y+1))‏
done exit 0
Đoạn lệnh trên sẽ liên tục in ra 16 số nguyên (015)‏

So sánh toán học
Toán tử so sánh                      

Giải thích
expr1 -eq expr2         true nếu hai biểu thức bằng nhau
expr1 -ne expr2         true nếu hai biểu thức không bằng
expr1 -gt expr2         true nếu biểu thức expr1> expr2
expr1 -ge expr2         true nếu biểu thức expr1>=expr2
expr1 -lt expr2          true nếu biểu thức expr1<expr2
expr1 -le expr2          true nếu biểu thức expr1<=expr2
! expr                         true nếu expr1 là false (toán tử not)

So sánh chuỗi
So sánh                                   Kết quả
string1 = string2       true nếu hai chuỗi bằng nhau
string1 != string2      true nếu hai chuỗi không bằng nhau
-n string1                   true nếu string1 không rỗng (null)
-z string1                    true nếu string1 rỗng
Chú ý :            $str1=$str2
khác với          $str1 = $str2


Kiểm tra điều kiện trên tập tin
So sánh                      Kết quả
-d file              true nếu file là thư mục
-e file              true nếu file tồn tại trên đĩa
-f file               true nếu file là tập tin thông thường
-g file              true nếu set group id được thiết lập trên file
-r file               true nếu file cho phép đọc
-s file              true nếu kích thước file khác không
-w file             true nếu file cho phép ghi
-x file              true nếu file được phép thực thi


Biểu thức điều kiện
•   Các script sử dụng lệnh [] hoặc test để kiểm tra điều kiện boolean.
•   Thường được sử dụng để đánh giá một điều kiện trong một câu lệnh điều kiện hay của một câu lệnh lặp.
•   Cú pháp :                test bieuthuc
Hay            [ bieuthuc ]
•   Có thể dùng các toán tử sau với biểu thức điều kiện : toán tử trên xâu ký tự, toán tự trên số nguyên, toán tử trên tập tin, toán tử logic


Toán tử AND
Lệnh sau thực hiện khi lệnh trước đã thực thi và trả về một lỗi thành công.
statements1 && statements2 && statements3 &&. .
Ví dụ : #!/bin/sh
touch file_one
rm -f file_two
if [ -f file_one ] && echo “hello”
&& [ -f file_two ] && echo “there”
then
echo “in if”
fi
exit 0


Toán tử OR
Toán tử OR trả về giá trị true thì ngừng việc thực thi.
Cú pháp :
statements1 || statements2 || statements3. . .


Cấu trúc điều kiện - Lệnh if
Cú pháp:
if condition then
statements else
statements fi
#!/bin/sh
echo “result: 5 + 4 = ”
read num
if [ “$num” -eq 9 ]
then
echo “true”
else
echo “wrong, 5 + 4 = 9”
fi

Cấu trúc điều kiện - Lệnh elif
elif cho phép kiểm tra điều kiện lần thứ hai bên trong else.
#!/bin/sh
echo “Nhap thoi diem trong ngay : ”
read st
if [ $st = “sang” ]; then
echo “Chao buoi sang !”
elif [ $st = ”chieu” ]; then echo “Chao buoi chieu !”
else
fi
echo “Chua xu ly !”
exit 1
exit 0


Lệnh for
Cú pháp:
for variable in values
do
#!/bin/sh
for stVar in 1 2 3 4 5 6
do
statements
done
done
exit 0
echo $stVar


Lệnh while
Cú pháp:
while condition do statements
done
Check condition
True
ACTION
End of the loop
False

• Ví dụ 1:
S=0 i=0
while [ $i  –lt  5 ]
do
i='expr $i + 1'
S='expr $S + $i'
done
echo “Tong = $S”

• Ví dụ 2:
#!/bin/sh
echo “Nhap mat khau:”
read pass
while  [  $pass  !=
"123abc" ]
do
read pass done
exit 0


Lệnh until
Cú pháp:
until
condition
do statements
done
True
Check condition
False
ACTION
End of the loop

Ví dụ: Đếm số tham số của 1 dòng lệnh
until [ $# -eq 0 ]
do
num='expr $num + 1'
echo “The $num argument is $1”
shift done


Lệnh case
Cú pháp:
case value in
pattern1 | pattern11)       command(s);; pattern2) command(s);; pattern3) command(s);; pattern4)       command(s);;
*)                            ;;
esac
#!/bin/sh
echo “is it morning ? yes or no”
read timeofday
case “$timeofday” in
“yes”) echo “good morning”;; “no” ) echo “good afternoon”;; “y” ) echo “good morning”;; “n” ) echo “good afternoon”;;
* )    echo “answer not recognized”;;
esac exit 0


Khối lệnh { . . . }
Sử dụng cặp {} để bọc khối lệnh :
if [ -f file_one ] {
ls -1
echo “complex block execute “
}
then
#echo “command completed”
fi


function
Shell cung cấp cho NSD tự tạo hàm hay thủ tục để triệu gọi bên trong script.
Cú pháp định nghĩa hàm :
function_name() {
statements
}
Để trả về một giá trị số ta có thể dùng lệnh return :
Ví dụ : sum1() {
return 5
}
Để trả về giá trị chuỗin ta có thể dùng lệnh echo :
Ví dụ : #!/bin/sh
sample_func() {
x=5
echo “Insight sample_func!”
}
echo “Goi su dung ham sample_func”
echo $x
sample_func
# y=$(sample_func)‏
exit 0


Biến toàn cục và biến cục bộ
•   Để khai báo biến cục bộ có hiệu lực trong hàm, dùng từ khóa local.
•   Nếu không có từ khóa local, các biến được xem là biến toàn cục.
•   Biến toàn cục được nhìn thấy và có thể thay đổi bởi tất cả các hàm trong script.
#!/bin/sh
sample_text=”global variable”
fun1() {
local sample_text=”local variable” echo “function fun1 is executing” echo $sample_text
}
echo $sample_text fun1
echo “script ended”
echo $sample_text exit 0


Hàm và cách truyền tham số
•   Truyền tham số cho hàm tương tự như truyền tham số trên dòng lệnh.
•   Ví dụ :
function1() "param1","param2","param3". . .
•    Bên trong hàm sử dụng các biến môi trường: $0, $1, $2 để lấy giá trị các tham số truyền vào


Các lệnh nội tại của shell
Ngoài các lệnh điều khiển, shell cung cấp các lệnh nội tại hữu ích khác.
break :      break để thoát khỏi vòng lặp for, while hay until.
continue : lệnh continue yêu cầu vòng lặp quay lại thực hiện bước lặp kế tiếp mà không cần thực thi các khối lệnh còn lại.
: (lệnh rỗng) lệnh : đôi lúc được dùng với ý nghĩa logic là true.
Ví dụ : while : tương tự như while true.
. ( thực thi) dùng để thực thi một script trong shell hiện hành.
•   eval : Cho phép bạn ước lượng một biểu thức chứa biến.
•   exec : Dùng để gọi một lệnh bên ngoài khác. Thường exec gọi một shell khác với shell mà script đang thực thi.
•   exit n : Thoát khỏi shell nào gọi nó và trả về lỗi n.
•   set : Dùng để áp đặt giá trị cho các tham số.
•   unset : Dùng để loại bỏ biến khỏi môi trường shell
•   shift : Di chuyển nội dung tất cả các tham số môi trường xuống một vị trí.
trap : dùng để bẫy một tín hiệu (signal) do hệ thống gửi đến shell trong quá trình thực thi script.
Tín hiệu                       Ý nghĩa
HUP (1)     hang up nhận được khi người dùng logout
INT (2)      interupt tín hiệu ngắt được gửi khi người dùng nhấn  ctrl c
QUIT (3)   quit tín hiệu thoát, nhận khi người dùng nhấn ctrl \
ABRT (6)        (abort)  tín  hiệu  chấm  dứt,  nhận  khi  đạt  thời gian quá hạn (timeout)
ALRM (14)    (alarm) tín hiệu thông báo được dùng cho tình huống timeout
TERM (15)     (terminate)  tín  hiệu  nhận  được  khi  hệ  thống yêu cầu shutdown


Mở rộng tham số
•       Shell không cung cấp cấu trúc mảng.
•       Có thể thay thế tên biến, còn gọi là mở rộng tham số.
Ví dụ :       #!/bin/sh
1_tem=“string 1”
2_tem=“string 2”
3_tem=“string 3”
for i in 1 2 3 do echo ${i}_tem
done
exit 0
Kết thúc
CHƯƠNG 4 - CÀI ĐẶT PHẦN MỀM TRÊN LINUX
Cài đặt các ứng dụng trong Linux


Mục đích
 Cài đặt bằng cách dùng giao diện
 Cài đặt các ứng dụng từ mã nguồn trên Linux - phải dùng bằng dòng lệnh


Giới thiệu
 Trong Linux, một khó khăn và bất tiện là việc cài đặt các ứng dụng trên Linux, đặc biệt là các ứng dụng phải cài đặt từ mã nguồn.
 Tại sao lại là mã nguồn? Tại sao không biên dịch  dạng  thực  thi  như  window  rồi  phân phối?


Cách cài đặt cơ bản
 Gói có dạng rpm thì có thể dùng công cụ rpm để cài đặt gói tin (học trong phần Linux commands)
 Thông thường mã nguồn lấy về thường có dạng là .gz hoặc .bz2, đây đều là 2 chuẩn nén khác nhau.
 giải nén bằng gunzip cho gz hoặc bunzip2 cho bz2 thì các gói sẽ có dạng mới là tar

Từ mã nguồn
 Tuy nhiên có thể gộp vào việc giải nén bằng các tham số
 Đối với gói .gz:
# tar -zxvf tengoi.gz
 Đối với gói .bz2:
# tar -jxvf tengoi.bz2
 Giải nén xong, tìm tập tin INSTALL để đọc cụ thể cho phần hướng dẫn cài đặt.
 các gói đều tuân theo các thao tác tuần tự sau:
# ./configure
# make
# make install
 ./configure..
–  configure là một shell script sẽ kiểm tra những yêu cầu của hệ thống của bạn có đáp ứng đủ để cài đặt gói lên không, ví dụ như một số gói đòi hỏi bạn phải có sẵn thư viện đồ họa Gtk 2.4 trở lên hoặc là thư viện để giải nén nhạc Mp3
–  Chạy configure xong, kết quả cho biết các gói nào cần thiết để cài đặt. Nhiệm vụ là phải tìm các gói phụ thuộc đó cài lên máy rồi mới tiếp tục việc cài đặt
 Hệ thống Linux thỏa mãn đầy đủ các yêu cầu để cài đặt thì các Makefile sẽ được tạo ra.
 Makefile  là  một  file  đặc  biệt  của  tiện  ích make nhằm hướng dẫn biên dịch mã nguồn của gói ra dạng thực thi
 Thực thi lệnh 'make' xong thì toàn bộ mã nguồn của gói đã được biên dịch sang dạng thực thi nhưng các file thực thi vẫn còn nằm trên thư mục hiện hành.
 Cần phải thực hiện thêm lệnh 'make install' để chép các file thực thi đó sang đúng vị trí của nó trên hệ thống


Các thư mục cài đặt
 /usr là thư mục quan trọng, chứa các chương trình và hàm thư viện trên đó
 /usr là thư mục quan trọng nhất vì nó sẽ chứa các chương trình và hàm thư viện trên đó như mozilla, gedit .v.v...
 /usr/lib sẽ chứa các hàm thư viện, files có phần mở rộng là .so (shared object) là các hàm thư viện liên kết động hoặc .a (archive) hoặc .la đều là các hàm thư viện liên kết tĩnh
 /usr/share sẽ chứa các icon, manual hoặc info của gói


Gỡ bỏ 1 gói
 make clean
 make distclean
 make uninstall


Cài đặt đến thư mục tự chọn
 ./configure --prefix=/soft/gedit  -> khi cài gói vơi đường dẫn đích chỉ ra
 LD_LIBRARY_PATH sẽ có đường dẫn đến thư mục lib của gói vừa tạo (ví dụ như /soft/gedit/lib)
 PKG_CONFIG_PATH sẽ có đường dẫn đến thư mục pkg_config trong thư mục lib (ví dụ như /soft/gedit/lib/pkg_config).
 PATH : thêm vào biến PATH


Trợ giúp
 ./configure --help : xem trợ giúp
Kết thúc
CHƯƠNG 5 - CÀI ĐẶT TIẾNG VIỆT TRÊN LINUX


Mục đích
•  Hướng dẫn thực hành cách cài đặt một phần mềm trên môi trường Linux đặt biệt là tiếng Việt.
•  Giúp người sử dụng có thể soạn thảo được văn bản bằng tiếng Việt.


I - Giới thiệu bộ gõ tiếng Việt trên Linux
 Phần mềm quan trọng nhất nhì với người Việt Nam chính là bộ gõ tiếng Việt.
 Không có bộ gõ tiếng Việt trên máy thì quả thật làm việc gì cũng thấy… bế tắc.
 Gõ tiếng Việt trên Linux cũng có nhiều cách nhưng cách thông dụng và thân thuộc nhất là dùng xvnkb.
 xvnkb là một bộ gõ tiếng Việt mã nguồn mở khá có tiếng trong thế giới Chim cánh cụt.
 Nó hoạt động như Vietkey hay Unikey trên Windows.
 Bộ gõ xvnkb hiện nay đã có thể thay thế bằng SCIM với những tính năng tốt hơn cài đặt dễ dàng và giao diện dễ sử dụng hơn.

II - Cài đặt bộ gõ tiếng Việt Linux
1. Cài đặt trình biên dịch
 Chúng ta sẽ biên dịch từ mã nguồn (đảm bảo nhất) nên sẽ cần tải xuống trình biên dịch. Cái này cũng cần cho những lập trình viên nào nuôi ước mơ lập trình trên Linux.
 Chọn menu Application > Accessories > Terminal để mở cửa sổ dòng lệnh. Sau đó gõ lệnh sau:
sudo apt-get install build-essential
•   Chờ cho trình cài đặt tải xuống và giải nén tất cả các gói. Tuy nhiên, xvnkb khi biên dịch cũng yêu cầu thêm gói xorg-dev. Gõ thêm lệnh:
sudo apt-get install xorg-dev
1.   Tải xuống mã nguồn và cài đặt
•    Gõ lệnh sau để tải mã nguồn::
Wget http://xvnkb.sourceforge.net/xvnkb-0.2.9a.tar.bz2
•   Sau đó giải nén bằng lệnh:
tar -xvf xvnkb-0.2.9a.tar.bz2
•   Chuyển vào thư mục cần nén và biên dịch:
cd xvnkb-0.2.9a/
./autogen.sh
./configure --use-extstroke
Tiếp theo phải chỉnh file config. Gõ gedit config.h để chỉnh nội dung của file thành:
#define     VK_CONFIG_H
#define VK_CHECK_SPELLING
#define VK_USE_EXTSTROKE
#define VK_NEED_UCHAR
Sau đó gõ tiếp các lệnh sau:
make
sudo make install
Thế là cài xong xvnkb.Để khởi động chương trình bạn gõ xvnkb từ cửa sổ dòng lệnh là xong. Nhắp phải chuột lên hộp chương trình của xvnkb để xem menu tuỳ chọn. Nhắp trái chuột để bật tắt tuỳ chọn gõ tiếng Việt.
Nếu muốn xvnkb tự động chạy lúc khởi động, bạn vào menu  System >  Preferences >  Sessions,  chọn  New và nhập vào ô Command như sau: xvnkb --method=telex -- charset=utf8 (trong đó method là telex, vni hoặc viqr; charset là utf8, tcvn, viscii, vps hoặc viqr).
Bây  giờ  xvnkb  sẽ  khởi  động  mặc  định  với  kiểu  gõ (method) và bảng mã (charset) mà bạn đã chọn.
KẾT THÚC
CHƯƠNG 6 - LẬP TRÌNH C TRÊN LINUX

Mục đích
•  Hướng dẫn thực hành cách biên dịch và chạy thực hiện chương trình viết bằng C và C++ trên môi trường Linux.
•  Giúp  người  lập  trình  có  thể  sử  dụng  các thư  viện chuẩn của C.


I - Giới thiệu trình biên dịch GNU trên Linux
 Trình biên dịch GNU là công cụ phát triển thông dụng nhất có sẵn trong hệ điều hành Linux.
 Được dùng để biên dịch các kernel của hệ điều hành.
 Sử dụng trình biên dịch chủ yếu theo chuẩn GNU là gcc.
 gcc cung cấp cho người dùng các thư viện và các tập tin Header cần thiết để biên dịch và chạy chương trình.
 Chương trình viết bằng C thường có phần mở rộng là .c
 Chương trình viết bằng C++ thường có phần mở rộng là .cpp


II - Soạn thảo, biên dịch và thực thi chương trình C
1. Soạn thảo chương trình sử dụng tiện ích gedit. Lưu tập tin với phần mở rộng .c hoặc .cpp
Ví dụ: #gedit  hello.c
2. Thoát khỏi gedit, từ dấu nhắc hệ thống gõ lệnh:
Cú pháp:   gcc -o outfile   infile
Ví dụ:  # gcc –o   hello  hello.c
3. Nếu có lỗi, trình biên dịch sẽ thông báo số thứ tự dòng lệnh lỗi. Nếu biên dịch thành công, để chạy chương trình gõ lệnh:
Cú pháp:   ./outfile
Ví dụ:  # ./hello
Sau đây một số chương trình:

Ví dụ 1: Chương trình hello1.c
#include <stdio.h>
int main (int argc, char *argv[])
{
printf(“Hello, you are learning C!

”);
return 0;
}

# gcc –o hello1 hello1.c
# ./hello1
Chạy thực hiện chương trình:
# ./hello1
Kết quả như sau:
Hello, you are learning C!

Ví dụ 2: Chương trình hello2.c
#include <stdio.h>
int main (int argc, char *argv[])
{  int i=0;
printf(“Hello, you are still learning C!

”);
printf(“Number of arguments to the main function:%d

”,argc); for(i=0;i<argc;i++) printf(“Argument number %d is %s

” ,i, argv[i]); return 0;
}

# gcc –o hello2 hello2.c

Chạy thực hiện chương trình:
# ./hello2
Kết quả:?
# ./hello2 my name is TTien
Kết quả:?

Ví dụ 3: Chương trình hello3.c
#include <stdio.h>
int main (int argc, char *argv[])
{  int i=0;
printf("Content-type: text/plain

");
printf(“Hello, you are still learning C!

”);
printf(“Number of arguments to the main function:%d

”,argc);
for(i=0;i<argc;i++) printf(“Argument number %d is %s

” ,i, argv[i]);
return 0;
}

# gcc –o hello3 hello3.c
# ./hello3
Mở trình duyệt Web và gõ vào URL http://localhost/cgi-bin/hello3?thuy+tien
Ta sẽ thấynội dung của web được sinh ra bởi một chương trình C

Ví dụ 4: Chương trình hello4.c. Trong chương trình này đối số thứ 3 của hàm main là con trỏ đến một chuỗi xác định biến môi trường của hệ điều hành tại thời điểm chạy thực hiện chương trình.
#include <stdio.h>
int main (int argc, char *argv[], char *env[])
{  int i=0;
printf("Content-type: text/plain

");
printf(“Hello, you are still learning C!

”);
printf(“Number of arguments to the main function:%d

”,argc); for(i=0;i<argc;i++) printf(“Argument number %d is %s

” ,i, argv[i]); i=0;
printf("Environment variable:

");
while(env[i])

printf("env[%d]=%s

",i,env[i]);
i++;   
}
return 0;
}

# gcc –o hello4 hello4.c
# ./hello4
hoặc tại trình duyệt gõ:
http://localhost/cgi-bin/hello4
KẾT THÚC

CHƯƠNG 7 - LẬP TRÌNH NÂNG CAO TRÊN LINUX
ThS. Trần Hồ Thuỷ Tiên



Mục đích
•  Giúp sinh viên hiểu sâu hơn về tiến trình và cách quản lý tiến trình trên hệ  điều hành Linux.
•  Giúp người lập trình có thể sử dụng các thư viện chuẩn của C để lập trình liên quan đến tiến trình.


I – Tiến trình (Process)
 Khi chúng ta ngồi trước máy tính, có nhiều tiến trình đang chạy. Mỗi một chương trình đang chạy sử dụng một hoặc nhiều tiến trình.
 Mỗi tiến trình trên Linux được nhận biết thông qua pid của nó. Pid là một số 16 bits được gán tuần tự khi một tiến trình mới khởi tạo.
 Mỗi tiến trình có một tiến trình cha. Các tiến trình trong hệ điều hành Linux được sắp xếp thành cây tiến trình, với tiến trình khởi tạo (init) là tiến trình gốc (root). ID của tiến trình cha gọi là ppid.
 Khi tham chiếu đến ID của tiến trình trong chương trình  C hoặc C++, sử dụng kiểu pid_t, được định nghĩa trong <sys/type.h>.
 Một số lời gọi hệ thống có thể lấy được các thông số này:
int   getpid()    // trả về pid của tiến trình đang chạy.
int   getppid() // trả về pid của tiến trình cha của tiến trình đang chạy.
Ví dụ: Chương trình print-pid.c
#include <stdio.h>
#include <unistd.h>
int main()

printf("ID cua tien trinh la %d!

", (int) getpid());
printf("ID cua tien trinh cha la %d!

", (int) getppid());
return 0;
}


II – Xem các tiến trình
 Lệnh ps  hiển thị các tiến trình hiện diện trên hệ thống. Tại terminal gõ lệnh:
# ps
ps chỉ ra 2 tiến trình: bash là shell đang chạy terminal; và ps
 Để biết chi tiết hơn về các tiến trình đang chạy trên hệ điều hành, gõ lệnh:
# ps -e -o pid,ppid,command
Chú ý quan sát pid và ppid của tiến trình init và tiến trình ps.


III – Khởi tạo tiến trình
 Có 2 kỹ thuật để khởi tạo tiến trình mới:
1. Cách thứ nhất ít được dùng vì không hiệu quả và không an toàn.
2. Cách thứ hai phức tạp  hơn nhưng rất linh động, tốc độ, và an toàn.

III.1. Hàm system
 int system(“shell command” )
 Hàm system trong thư viện chuẩn của C cung cấp cách dễ nhất để thực hiện lệnh trong phạm vi một chương trình, nếu lệnh gõ được ở shell. Trên thực tế, system tạo ra một tiến trình con chạy Bourne shell (/bin/sh) và chuyển lệnh để cho shell thực hiện.
Ví dụ:
#include <stdlib.h>
int main()
{
int return_value;
return_value = system("ls -l /");
return return_value;
}
Hàm system trả về trạng thái exit của shell. Nếu shell không chạy, system trả về 127; nếu xãy ra lỗi khác system trả về -1.

III.2. Hàm fork và exec
int fork()
int exec()
 Linux cung cấp  hàm fork() để tạo ra một tiến trình con là một bản sao của tiến trình cha. Linux cũng cung cấp hàm khác là exec() tạo ra tiến trình riêng biệt để kết thúc một instance của một chương trình thay vì trở thành một instance của một chương trình khác.
Ví dụ1: Chương trình fork.c sử dụng hàm fork()
#include <stdio.h>
#include <unistd.h>
int main()
{
int child_pid;
printf("Chuong trinh chinh co ID cua tien trinh la %d!

", (int) getpid());
child_pid = fork();
if (child_pid !=0)
{
printf("Day la tien trinh cha, voi ID la %d!

", (int) getpid());
printf("ID cua tien trinh con la %d!

", child_pid);
}
else   printf("Day la tien trinh con, voi ID la %d  %d!

", (int) getpid(),child_pid);
return 0;
}

Ví dụ 2: Chương trình fork_exec.c sử dụng hàm fork() & exec()
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int spawn(char * program, char* *arg_list)
{
int child_pid=fork();
if(child_pid !=0) return child_pid;
else{
execvp (program, arg_list); fprintf(stderr,"Loi xay ra trong execvpn"); abort();
}

int main()
{
char* arg_list[]={"ls","-l","/",NULL};
spawn("ls", arg_list);
printf("Ket thuc chuong trinh chinh

");
return 0;
}


IV – Kết thúc tiến trình
Một tiến trình có thể kết thúc bằng một trong hai cách
- Gọi hàm exit
- Gặp hàm return của hàm main của chương trình.
Khi tiến trình kết thúc, mỗi tiến trình có mã kết thúc (exit code): một số trả về cho tiến trình cha của nó.

IV.1. Hàm kill()
#include <sys/type.h>
#include <signal.h>
int kill (int child_pid, int signal number);
- child_pid: ID của tiến trình kết thúc.
- signal number: Sử dụng SIGTERM là hằng mặc định để kết thúc tiến trình dùng hàm kill.
Nếu exit code trả về là 0 chương trình kết thúc thành công.Nếu exit code trả về giá trị khác 0 chương trình kết thúc lỗi.

IV.2. Chờ cho tiến trình kết thúc
Trong một số trường hợp tiến trình cha chờ cho đến khi một trong số tiến trình con kết thúc, thực hiện lời gọi hệ thống wait.
wait(int *child_status);
Một số lời gọi hệ thống tương tự:
waitpid: chỉ rõ tiến trình con kết thúc
wait3: thu hồi CPU để kết thúc tiến trình con

IV.3. Các tiến trình Zombie
Nếu tiến trình con kết thúc trong khi tiến trình cha đang gọi wait, tiến trình con và trạng thái kết thúc sẽ bị bỏ qua.
Nhưng điều gì sẽ xãy ra khi một tiến trình con kết thúc và tiến trình cha không gọi  wait? Liệu có bỏ qua đơn giản như vậy không? Câu trả lời là Không. Bởi vì, các thông tin sẽ bị đánh mất. Vì vậy, thay vì kết thúc tiến trình trở thành tiến trình Zombie.
=> Một tiến trình Zombie là tiến trình kết thúc nhưng chưa xoá hẳn.

Ví dụ: Chương trình zombie.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{  int child_pid;
child_pid = fork();   /* Tao tien trinh con*/
if (child_pid > 0){
printf(" Day la tien trinh cha. Ngu 1 phut. Dang sleep

");
sleep(60);
}
else     exit(0); /* Day la tien trinh con. Ket thuc*/
return 0;
}

=> Biên dịch và chạy chương trình từ dòng lệnh.
=> Tại terminal gõ lệnh
$ ps -e -o pid, ppid, stat, cmd


V – Giao tiếp giữa các tiến trình
Có 5 kiểu giao tiếp giữa các tiến trình:
Bộ nhớ chia sẻ (Shared memory). Bộ nhớ ánh xạ (Mapped memory). Giao tiếp bằng đường ống (Pipes). FIFO. Socket.

V.1. Bộ nhớ chia sẻ (Shared memory)
Cho phép các tiến trình giao tiếp bằng cách đọc và ghi lên một vùng nhớ được chỉ ra.
Đây là cách đơn giản nhất cho phép hai hay nhiều tiến trình giao tiếp với nhau bằng cách truy cập đến cùng bộ nhớ.
Khi một tiến trình thay đổi bộ nhớ, tất cả các tiến trình khác cũng sẽ thay đổi theo.
Một số hàm thông dụng:
#include <sys/shm.h>
#include <sys/stat.h>

V1.1.  Hàm tạo phân đoạn bộ nhớ chung
int  shmget(int key, int shared_segment_size, int flag);
- key: chỉ phân đoạn được tạo ra. Sử dụng hằng  IPC_PRIVATE mặc  định tạo ra phân đoạn mới.
- shared_segment_size: số byte của phân đoạn. Vì segment cấp phát phân trang nên số byte là bội số của 1 trang.
- flag: Giá trị của flag có thể là:
IPC_CREAT: chỉ rõ một segment mới sẽ được tạo.
IPC_EXCL: luôn được dùng với IPC_CREAT, tạo ra lỗi nếu segment đã tồn tại. Nếu flag này không chỉ ra và key của một segment đã dùng, shmget trả về segment đã tồn tại thay vì tạo ra một segment mới.
Mode flag: 9 bits liên quan đến owner, group, và cách truy cập đến segment. Các hằng này được định nghĩa trong <sys/stat.h>. (Chẳng hạn: S_IRUSR, S_IWUSR, S_IROTH, S_IWOTH,...)
Ví dụ:
int segment_id = shmget (shm_key, getpagesize(), IPC_CREAT | S_IRUSR | S_IWUSER);
=> Nếu lời gọi thành công, shmget trả về phân đoạn. Nếu phân đoạn sẵn sàng, cho phép  truy cập.

V.1.2. Hàm gắn kết phân đoạn bộ nhớ chung
char *shmat(int segment_id, int * address, int flag);
- segment_id: SHMID trả về bởi hàm shmget.
- address: con trỏ trỏ đến địa của segment mà ở đó ta cần ánh xạ. Nếu chỉ NULL (0), Linux sẽ chọn địa chỉ có giá trị.
- flag: có thể là các hằng sau:
SHM_RND: làm tròn xuống bội số của kích thước trang,
SHM_RDONLY: segment chỉ đọc, không được ghi.
=> Nếu lời gọi thành công thì trả về địa chỉ của phân đoạn dùng chung. Tiến trình con được tạo ra bởi hàm fork() có thể được gắn kết vào phân đoạn này, và có thể gỡ bỏ nếu muốn.

V.1.3. Hàm gỡ bỏ gắn kết phân đoạn bộ nhớ chung
Khi dùng xong phân đoạn bộ nhớ chung, chúng phải được gỡ bỏ, dùng hàm:
char *shmdt(char *address);
- address: địa chỉ trả về bởi shmat.
=> Nếu phân đoạn được cấp phát lại, tiến trình sau cùng sử dụng nó.

V.1.4. Hàm chỉ định kích thước phân đoạn
void shmctl(int segment_id, struct shmid_ds *pointer, struct shmid_ds *shmbuffer);
- segment_id: chỉ ra phân đoạn bộ nhớ,
- pointer: Chỉ ra thông tin về phân đoạn bộ nhớ dùng chung. Có thể là các hằng sau:
IPC_STAT: Con trỏ trỏ đến struct shmid_ds. IPC_RMID: Xoá phân đoạn, và đối số thứ 3 phải là NULL

Ví dụ: Chương trình bộ nhớ chia sẽ shm.c
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main()
{
int segment_id;
char* shared_memory; struct shmid_ds shmbuffer; int segment_size;
const int shared_segment_size = 0x6400;
/* Chi ra shared memory segment */
segment_id  =  shmget(IPC_PRIVATE,  shared_segment_size,  IPC_CREAT  |  IPC_EXCL  | S_IRUSR | S_IWUSR);
/* Gan ket phan doan bo nho chung*/
shared_memory = (char*) shmat(segment_id, 0, 0);
printf("Bo nho chia se gan ket den dia chi %p

", shared_memory);
/* Chi dinh kich thuoc phan doan */ shmctl(segment_id, IPC_STAT, &shmbuffer); segment_size = shmbuffer.shm_segsz;
printf("Kich thuoc segment: %d

", segment_size);
/* Ghi mot chuoi len phan doan bo nho dung chung*/
sprintf(shared_memory, "Hello, hello, hello!!!");
/* Go bo gan ket phan doan bo nho chung*/
shmdt(shared_memory);              
/* Gan ket lai phan doan bo nho chung voi dia chi khac*/ shared_memory = (char*) shmat(segment_id, (void*) 0x5000000, 0); printf("Bo nho chia se gan ket lai den dia chi %p

", shared_memory);
/* In ra chuoi tu bo nho chia se*/
printf("%s

", shared_memory);
/* Go bo gan ket phan doan bo nho chung*/
shmdt(shared_memory);
/* Chi dinh lai kich thuoc phan doan */ shmctl(segment_id, IPC_RMID,0); return 0;
}
=> Biên dịch và chạy chương trình từ dòng lệnh.
=> Tại terminal gõ lệnh
$ ipcs -m

V.2. Bộ nhớ ánh xạ (Mapped memory)
Bộ nhớ  ánh xạ tương tự như chia sẻ bộ nhớ, nhưng nó cho phép các tiến trình khác nhau có thể giao tiếp dựa vào một file dùng chung.
Bộ nhớ ánh xạ là một dạng giao tiếp giữa một file với bộ nhớ của tiến trình. Linux chia file thành các trang và sau đó copy chúng vào trang bộ nhớ ảo. Vì vậy, một tiến trình có thể đọc nội dung của file bằng cách truy cập bộ nhớ thông thường. Có thể chỉnh sửa nội dung của file bằng cách ghi vào bộ nhớ. Điều này giúp truy cập file nhanh hơn.

V.2.1. Ánh xạ một file thường (Ordinary File)
Để ánh xạ một file thông thường đến bộ nhớ của tiến trình, sử dụng lời gọi:
void* mmap(int *address, int filelength, int property, int flag , int fd, int
offset);
- address: địa chỉ của tiến trình. Nếu bằng NULL cho phép Linux chọn một địa chỉ bắt đầu.
void* mmap(int *address, int filelength, int property, int flag , int fd, int offset);
- filelength: Độ dài của vùng nhớ.
- property: Thuộc tính bảo vệ vùng nhớ ánh xạ. Có thể có các hằng sau:
PROT_WRITE: Quyền ghi PROT_READ: Quyền đọc PROT_EXEC: Quyền thực thi
- flag: Giá trị tuỳ chọn để ánh xạ. Có thể ánh xạ tất cả hay một phần của file vào bộ nhớ bằng các tuỳ chọn sau:
MAP_FIXED: Linux sử dụng địa chỉ mà bạn yêu cầu để ánh xạ đến file.
MAP_PRIVATE: Ghi lên phạm vi vùng nhớ riêng để copy file mà không attached file. Tiến trình khác không nhìn thấy.
void* mmap(int *address, int filelength, int property, int flag , int fd, int offset);
MAP_SHARED: Ngược lại với MAP_PRIVATE. Mode này được dùng khi ánh xạ bộ nhớ cho IPC.
- fd: Bộ mô tả file mở file để ánh xạ.
- offset: Vị trí tương đối của file để bắt đầu.
=> Nếu lời gọi thành công, trả về con trỏ trỏ đến địa chỉ bắt đầu của vùng nhớ. Nếu lỗi, trả về MAP_FAILED.

Ví dụ:
file_memory = mmap(0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd,0); //Để Ghi
file_memory = mmap(0, FILE_LENGTH, PROT_READ  |PROT_WRITE, MAP_SHARED, fd,0); // Để Đọc & Ghi

V.2.2. Gỡ bỏ vùng nhớ ánh xạ
Sau khi hoàn tất ánh xạ bộ nhớ, vùng nhớ phải được gỡ. Bằng cách sử dụng hàm munmap.
void munmap(int *address, int filelength);
Linux tự động gỡ bỏ vùng bộ nhớ ánh xạ khi tiến trình kết thúc.

Ví dụ 1: Chương trình ghi ngẫu nhiên một số lên file ánh xạ bộ nhớ mmap- write.c.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#define FILE_LENGTH 0X100
int random_range (unsigned const low, unsigned const high)
{  unsigned const range = high - low + 1;
return   low   +   (int)   (((double)range)   *   rand()   /(RAND_MAX   +   1.0));   }
int main(int argc, char* const argv[])
{
int fd;
void* file_memory;
/* Khoi tao bo so ngau nhien */
srand (time (NULL));
/* Chuan bi mot file du lon de chua so nguyen unsigned */
fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
lseek(fd, FILE_LENGTH+1, SEEK_SET);
write(fd,"",1);
lseek(fd, 0, SEEK_SET);
/* Tao bo nho anh xa */
file_memory = mmap(0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd,0);
close(fd);
/* Ghi so nguyen random len vung bo nho anh xa*/
sprintf((char*) file_memory,"%d

", random_range(-100,100));
/* Go bo bo nho */
munmap(file_memory, FILE_LENGTH);
return 0;
}

Ví dụ 2:  Chương trình đọc một số nguyên từ file ánh xạ bộ nhớ và nhân đôi nó. mmap-read.c.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#define FILE_LENGTH 0x100
int main(int argc, char* const argv[])
{
int fd;
void* file_memory;
int integer;
/* Mo file */
fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR);
/* Tao bo nho anh xa */
file_memory    =    mmap(0,    FILE_LENGTH,   PROT_READ    |PROT_WRITE, MAP_SHARED, fd,0);
close(fd);
/* Doc so nguyen, in ra va nhan doi chung */ scanf(file_memory,"%d",&integer); printf("Gia tri: %d

", integer);
sprintf((char*) file_memory,"%d

", 2*integer);
/* Go bo bo nho */
munmap(file_memory, FILE_LENGTH);
return 0;
}
=> Để chạy 2 ví dụ này. Giả sử ánh xạ đến file có tên ./integer-file. Tại terminal lần lượt gõ các lệnh sau:
$ ./mmap-write ./integer-file
$ cat ./integer-file
-76
176
$ ./mmap-read ./integer-file
-76
176
Gia tri: 7466272
$ cat ./integer-file
14932544

V.3. Giao tiếp bằng đường ống (Pipes)
Pipe cho phép giao tiếp tuần tự từ tiến trình này đến các tiến trình khác.
Một pipe là một thiết  bị truyền thông tuần tự.; dữ liệu có thể đọc từ pipe  cùng lúc ghi lên pipe.
Pipe còn được dùng để liên lạc giữa hai thread trong một tiến trình hay giữa tiến trình cha và tiến trình con.
Trong shell ký hiệu | là để tạo ra pipe.
Ví dụ:
$ ls | less
Shell cũng tạo ra pipe kết nối đầu ra của tiến trình ls với đầu vào của tiến trình less.
Một pipe là một kênh liên lạc trực tiếp giữa hai tiến trình : dữ liệu xuất của tiến trình này được chuyển đến làm dữ liệu nhập cho tiến trình kia dưới dạng một dòng các byte.
Khi một pipe được thiết lập giữa hai tiến trình, một trong chúng sẽ ghi dữ liệu vào pipe và tiến trình kia sẽ đọc dữ liệu từ pipe. Thứ tự dữ liệu truyền qua pipe được bảo toàn theo nguyên tắc FIFO.
Một pipe có kích thước giới hạn. Nếu tiến trình ghidữ liệu nhanh hơn tiến trình đọc thì tiến trình ghi bị chặn lại cho đến khi tiến trình đọc đọc bớt đi 1byte. Và ngược lại.
Lời gọi pipe tạo ra bộ mô tả file, bộ mô tả file này chỉ có giá trị trong tiến trình này và tiến trình con của nó. Bộ mô tả file của tiến trình không thể bỏ qua các tiến trình không liên quan. Tuy nhiên, khi tiến trình gọi fork, các bộ mô tả file  được copy đến tiến trình con mới tạo. Vì vậy, pipe chỉ có thể nối trực tiếp đến các tiến trình liên quan.

# include < unistd.h >
int pipe_fds[2];
int read_fd;
int write_fd;
int pipe(int pipe_fds[]);
read_fd = pipe_fds[0]'
write_fd = pipe_fds[1]'                                                

V.3.2. Giao tiếp giữa tiến trình cha và các tiến trình con
Để tạo một pipe cầ cung cấp một mảng nguyên gồm 2 phần tử. Bộ mô tả file sẽ cho phép đọc lên phần tử 0 và ghi lên phần tử 1. Hàm tạo pipe như sau:
# include < unistd.h >
int pipe_fds[2];
int read_fd;
int write_fd;
int pipe(int pipe_fds[]);
read_fd = pipe_fds[0]' write_fd = pipe_fds[1]'

Ví dụ: Sử dụng pipe giao tiếp với tiến trình con. Chương trình pipe.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void writer(const char* message, int count, FILE* stream)
{ for (; count > 0; --count){
fprintf (stream, "%s

", message);
fflush(stream);
sleep(1);
}
}
// Đọc ngẫu nhiên chuỗi từ stream void reader(FILE* stream)
{
char buffer[1024];
while (!feof(stream)&& !ferror (stream) && fgets(buffer, sizeof (buffer), stream) != NULL)
fputs (buffer, stdout);
}
int main()
{
int fds[2];
pid_t pid;
pipe (fds); //Tao pipe pid = fork();
if (pid ==(pid_t)0){
FILE* stream;
close (fds[1]);
stream = fdopen(fds[0], "r");
reader (stream);
close (fds[0]);
}
else {
FILE* stream;
close (fds[0]);
stream = fdopen (fds[1],"w");
writer ("Hello, hello, hello!!!", 5, stream);
close(fds[1]);
}
return 0;
}

V.4. FIFO
Tương tự như đường ống, trừ khi nó không liên quan đến các tiến trình có thể truyền thông được bởi vì đường ống đã gán 1 tên trong hệ thống file.

V.5. Socket
Truyền thông được giữa các tiến trình không liên quan ngay cả khi chúng ở trên các máy tính khác nhau.

KẾT THÚC

Bạn đang đọc truyện trên: Truyen2U.Pro