Upload
thuyet-nguyen
View
18
Download
0
Embed Size (px)
Citation preview
CHƯƠNG 6
LẬP TRÌNH LINUX
3/15/2010 1
6.1 Nhập môn lập trình Linux
6.1.1 Linux và Unix
• UNIX - Hệ điều hành server mạnh , được thử thách qua thời gian.
• Windows 2000 server ra đời - cạnh tranh với UNIX
• Cả UNIX và Win 2k sản phẩm có bản quyền ( Mặc dù Unix là sản
phẩm mã nguồn mở - SUN đã thương mại hóa)
• Linux ra đời trên nền tảng Unix , được toàn cộng đồng phát triển
và là sản phẩm mã nguồn mở rất phổ biến
• Linux là kernel cung cấp những chức năng tối thiểu của OS Unix.
• Ưu điểm Linux : Ổn định,tính kế thừa. Mọi chương trình trên Unix đều có thể chạy trên Linux ( Giống nhau 98%)
3/15/2010 2
6.1.2 Cộng đồng mã nguồn mở GNU
• Cộng đồng GNU ( “Gnu is Not Unix”) đã xây dựng nhiều ứng dụng trên Unix (Linux) : Word proccessing ,Office, Game, Multimedia, networking và các compiler , interpriter , programming languages…
• GNU - Phi lợi nhuận song cần tuân thủ một số quy định về bản quyền của GNU - GPL (General Public License) - “copyleft”( thay cho “copyright”)
•GNU cung cấp bộ biên dịch C/C++bao gồm :
- gcc trình biên dịch C
– g++ trình biên dịch C++
– gdb Debug
– GNU make Trình quản lý mã nguồn và trợ giúp biên dịch
- bash shell
3/15/2010 3
6.1.3 Lập trình trên Linux
• Ngôn ngữ C hỗ trợ rất tốt cho lập trình trên Linux.Tuy nhiên nó không phải là lựa chọn duy nhất.Có thể dùng Pascal , Assembler , Perl , Java , PHP…
• Chương trình Linux tồn tại trên hai dạng : thực thi ( file binary) giống như file *.exe trong DOS và thông dịch (script) giống như file *.bat . Hai dạng file này có thể
hoán đổi cho nhau . Để chay chương trình cần cấp quyền thực thi “x”
• Đường dẫn tới tập tin binary /bin/,/user/bin,user/local/bin ,./
• Cài biến môi trường
PATH = /bin:/user/bin:/user/local/bin:.
3/15/2010 4
6.1.4 Chương trình“ Hello world”
$vi helloworld.c
#include <stdio,h>
int main()
{
printf(“Helloworld \n”);
exit(0)
}
3/15/2010 5
6.1.5 Trình biên dịch gcc (gcc++)
gcc helloworld.c -o helloworld
Tùy chọn -o tạo ra file thực thi
helloworld Nếu không có -o tạo ra file
thực thi a.out
3/15/2010 6
6.2 Phát triển chương trình trên ngôn ngữ c
6.2.1 Chương trình trên Linux
• Trình biên dịch gcc thường nằm trong /usr/bin hoặc
/usr/local/bin. Khi biên dịch nó cần sự hỗ trợ của các file
C header trong /usr/include hoặc
/usr/local/include • Các thư viện liên kết nằm trong
/lib hoặc /usr/local/lib.
• Các thư viện chuẩn của gcc nằm trong /usr/lib/gcc- lib
• Chương trình nhị phân có thể nằm ở bất kỳ đâu song khi thực thi ta cần chỉ đường dẫn thông qua biến môi trường
PATH
3/15/2010 7
6.2.2 Header file
Định nghĩa hàm , khai báo các hằng với cấu trúc dữ liệu cần thiết khi biên dịch.Các header năm trong
/usr/include;/usr/local/include hoặc các thư mục con /usr/include/asm hoặc /usr/include/sys ví
dụ : #include <sys/types>.h
Một số đường dẫn đến các file header mặc định như
/usr/include/g++-2 (dùng cho trình biên dịch C++) Nếu
muốn tổ chức các header của riêng mình nằm ngoài thư mục
mặc định , ta phải chỉ rõ đường dẫn đến thư mục đó khi biên
dịch bằng tùy chọn -I
gcc -I/usr/mypro/include test.c -o test
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 8
(2009)
• Khi sử dụng hàm nào đó của thư viện hệ thống , để biêt hàm này được định nghĩa trong file header nào ta dùng lệnh man.Ví dụ hàm kill()
$man 2 kill
Sử dụng hai
file header
sys/types.h
và signal.h
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 9
(2009)
6.2.3 Các file thư viện
• Dùng để trình biên dịch bắt lỗi cú pháp , kiểm tra kiểu chương trình và tạo các object file.Trong Linux các file thư viện có phần mở rộng là.a,.so hoặc.sa và bắt đầu bằng lib . ví dụ libutil.a ; libc.so
• Hai loại liên kết:Static Link Library (.a) và Dinamic
Link Library(.so) Dùng lệnh ls /usr/lib để xem các thư
viện
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 10
(2009)
1.Tạo object file (.o) dùng tùy chọn -c ( giống .obj) trên C
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 11
(2009)
2. Thư viện liên kết tĩnh :
Trình biên dịch lấy toàn bộ mã thực thi của hàm thư viện
và đưa vào chương trình chính.Ví dụ program.c a.
Tạo hai thư viện đối tượng từ mã nguồn bob.c và
alice.c bob.o và alice.o
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 12
(2009)
b. Xây dựng hàm
lib.h $gedit lib.h
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 13
(2009)
c. Viết hàm program.c
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 14
(2009)
d. Biên dịch liên kết các thư viện
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 15
(2009)
• File thư viện .a là file chứa tập hợp các file thư viện đối tượng .o , là một dạng file nén được tạo bởi lệnh ar
Đã có thư viện libfoo.a , ta liên kết lại với
chương trình chính
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 16
(2009)
e.Tương thích giữa Linux và Windows/DOS
Linux Windows/DOS Ý nghĩa
func.o func.obj File đối tượng
lib.a lib.lib Static link lib
program program.exe Execute file
lib.so lib.dll Dinamic link lib
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 17 (2009)
3. Thư viện liên kết động
• Nhược điểm của TVLK tĩnh : Nhúng mã nhị phân vào
chương trình khi biên dịch. Rất tốn không gian bộ nhớ và
phải biên dịch lại mỗi khi thay đổi chương trình.
18
• Thư viện liên kết động giải quyết vấn đề trên. Trình liên
kết chỉ lưu các tham chiếu đến các hàm trong thư viện liên
kết. Khi thực thi, HDH sẽ chính thức nạp thư viện liên kết
cần thiết vào bộ nhớ. Như vậy, nhiều chương trình có thể
sử dụng chung một DLL duy nhất.
• Thư viện liên kết động trong Linux có phần mở rộng .so
• Để biên dịch file thư viện để đưa và liên kết sử dụng tùy
chọn -fpic hoặc -fPIC (Position Independence Code)
a. Tạo file đối tượng cho DLL
b. Tạo liên kết động cho các file .o trên - Dùng tùy chọn -shared
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 19
(2009)
c. Biên dịch lại program.c
# chỉ đường dẫn đến thư mục chưa libfoo.so
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 20
(2009)
• Kiểm tra HDH có tìm ra các file thư viện liên kết động dùng lệnh ldd
3/15/2010 CHƯƠNG 6 - LẬP TRÌNH LINUX 21
(2009)