1. Trang chủ
  2. » Công Nghệ Thông Tin

Chương 4: Nhập môn lập trình Linux

61 647 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Chương 4: Nhập môn lập trình Linux
Trường học Trường Đại học Quốc gia Thành phố Hồ Chí Minh
Chuyên ngành Nhập môn Lập trình Linux
Thể loại Giáo trình
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 61
Dung lượng 1,28 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

 Chương trình viết trên Unix đều có thể chạy tốt trên Linux và ngược lại  Linux đã được phát triển dựa trên việc tận dụng những ưu điểm và khắc phục những khuyết điểm của các HĐH tựa

Trang 1

2 C ng đ ng GNU và General Public License ộng đồng GNU và General Public License ồng GNU và General Public License

3 L p trình trên Linux ập trình trên Linux

4 Ch ng trình Unix và Linux ương trình Unix và Linux

5 Ch ng trình Linux đ u tay helloworld.c ương trình Unix và Linux ầu tay helloworld.c

6 Tìm tr giúp v trình biên d ch ợ giúp về trình biên dịch ề trình biên dịch ịch

7 Phát tri n ch ng trình v i ngôn ng C ển chương trình với ngôn ngữ C ương trình Unix và Linux ới ngôn ngữ C ữ C

8 Th vi n liên k t trên Linux ư ện liên kết trên Linux ết trên Linux

Trang 2

4.1 Linux và Unix

- Unix được đánh giá là một HĐH mạnh, ổn định Trước đây được xem

là một HĐH mã nguồn mở và từ khi Sun Microsystems nâng cấp lên

thành một sản phẩm thương mại  mất dần tính mở của HĐH Unix

- Các dòng sản phẩm Server của Microsoft đã và đang cạnh tranh với các dòng tương đương thuộc họ UNIX (như FreeBSD, Linux, Debian, SCO Unix,…)

- Theo dòng lịch sử thì với việc kế thừa và phát huy những tính năng nổi bật của một HĐH đã qua thử thách - UNIX – {mã nguồn mở + tính ổn

định}  Linux đã được ủng hộ và được sử dụng bởi cộng đồng trên toàn

thế giới

Trang 3

- Một số tính năng khác của HĐH Linux so với HĐH Unix :

 Là hạt nhân cung cấp các chức năng cần thiết tối

thiểu của HĐH tựa Unix (Linux giống Unix gần

98%)

 Là một sản phẩm có giá trị do Unix không có

phiên bản chạy trên hệ máy PC với kiến trúc Intel

Trang 4

 Chương trình viết trên Unix đều có thể chạy tốt trên

Linux và ngược lại

 Linux đã được phát triển dựa trên việc tận dụng những

ưu điểm và khắc phục những khuyết điểm của các HĐH tựa UNIX

 Linux ngày nay được sử dụng rộng rãi và chính do yếu

tố phổ biến trên đã được sự hỗ trợ giúp đỡ của khá nhiều cộng đồng người dùng trên thế giới

Trang 5

4.2 Cộng đồng GNU và General Public License

- Ngoài HĐH, còn có các chương trình ứng dụng phục

vụ cho yêu cầu của người dùng

- Cộng đồng Open Source đã xây dựng nhiều ứng

dụng có khả năng chạy được trên Unix/Linux và nhìn chung theo xu hướng hiện đại nhằm lôi kéo người

dùng Linux theo phương châm “Windows có gì ~

Linux có tương ứng như vậy”

Trang 6

- GNU – { G NU’s N ot U NIX} – GNU theo nguyên gốc tiếng

Anh là “linh dương đầu bò” <=> là biểu tượng của tổ chức

cộng đồng mã nguồn mở

- Tham khảo các phần mềm ứng dụng miễn phí tại địa chỉ

http://www.gnu.org/software/software.html

- Khi sử dụng các phần mềm của tổ chức GNU thì cần phải

tuân thủ một số quy định của tổ chức trên  Giấy phép chứng nhận GPL còn gọi là copyleft thay cho copyright cho các

chứng nhận bản quyền thương mại

Trang 8

4.3 Lập trình trên Linux

- Nguyên thủy Unix được viết bằng C và phần lớn các ứng dụng trên

Unix được viết bằng C

- Ngoài C là lựa chọn duy nhất, có thể sử dụng Pascal, Assembly hoặc Perl để xây dựng các chương trình cho Linux

Trang 9

4.4 Chương trình Unix và Linux

- Chương trình trên Unix và Linux tồn tại ở hai dạng:

• Dạng thực thi (tập tin nhị phân)

• Dạng thông dịch (tập tin script)

 File chương trình thực thi ~ như tập tin exe của MS-DOS/Windows

 File script là những chỉ thị lệnh được thực thi bởi shell hay trình

thông dịch nào đó (Perl, Python, Tcl, )  tương tự như các tập tin bat

của MS-DOS, VBScript và JavaScript của Windows Script Host

- Các file script và chương trình nhị phân đều có khả năng và mạnh

ngang nhau  Do vậy, lúc thực thi khó phân biệt được đâu là lệnh gọi

chương trình nhị phân và đâu là lệnh thực hiện script

- Khi chương trình được gọi, Linux sẽ tìm đường dẫn đến nơi chứa tập

tin chương trình trong biến môi trường PATH Thông thường, biến này chứa các đường dẫn sau /bin, /user/bin, /usr/local/bin

Trang 10

- Đối với người quản trị hệ thống, có thêm một số đường dẫn trỏ đến thư

mục /sbin, /usr/sbin

- Unix/Linux sử dụng dấu “:” để phân cách các đường dẫn trong biến

môi trường PATH, trong khi MS-DOS dùng dấu “;”

- Ví dụ:

PATH = /bin: /user/bin: /usr/local/bin:.:

Trang 11

4.5 Chương trình Linux đầu tay (Helloworld.c)

- Dùng trình soạn thảo bất kỳ (trong Console Mode) để soạn thảo source code như:

- Một giao diện khác tương tự như trong Turbo C của Borland thì sử

dụng trình soạn thảo wpe (cho phép kết hợp chức năng biên dịch của cc,

gcc, pascal)

- Tham khảo Ví dụ 4-1: helloworld.c

Trang 12

Windows Programming Environment

(WPE)

== - -==

Hình 4.1

Trang 14

- Sử dụng gcc (hoặc cc) để biên dịch như sau:

#gcc helloworld.c -o helloworld

#./helloworld

Hello World

#

Trang 15

4.6 Tìm trợ giúp về trình biên dịch

- Trong trình gcc có rất ít tùy chọn (-o, -g, -l, -I, v.v ).

- Sử dụng lệnh man để tham khảo thêm một số tuỳ chọn khác.

- Trong bộ chương trình GNU cũng kèm theo chương trình info có ưu

điểm là hướng dẫn sử dụng phần mềm rất chi tiết Cách thức dùng lệnh

info như man.

Trang 16

4.7 Phát triển chương trình với ngôn ngữ C

- Sử dụng ngôn ngữ C làm ngôn ngữ chính trong chương trình

- Ngôn ngữ lập trình C không phụ thuộc vào HĐH nào

4.7.1 Chương trình trên Linux

- Cần nắm rõ vị trí đặt tài nguyên để xây dựng chương trình như trình

biên dịch, file thư viện, các file header khai báo hàm và cấu trúc dữ

- Chương trình sau khi biên dịch có thể đặt bất kỳ đâu trên hệ thống miễn

là HĐH có thể tìm thấy trong biến môi trường PATH hoặc theo đường

dẫn tuyệt đối trong dòng lệnh

Trang 17

- Sử dụng tùy chọn -I để chỉ ra thư mục chứa các file header của riêng

mình (khác với thư mục mặc định của hệ thống)

- Ví dụ:

#gcc –I /usr/mypro/include test.c -o test

- Xem thông tin về các hàm trong thư viện #man <function name>

Trang 18

4.7.3 Các file thư viện

- Để tạo ra chương trình thực thi, cần có các file thư viện

- Trong Linux, các file thư viện thường là “.a”, “.so”, “.sa” và được bắt

thư viện trong Linux

- Có 2 loại thư viện liên kết:

• Liên kết động (Dynamic)

• Liên kết tĩnh (Static)

- Khi biên dịch, thông thường chương trình liên kết (ld) sẽ tìm thư viện

trong 2 thư mục chuẩn /usr/lib và /lib

Trang 19

4.8 Thư viện liên kết trên Linux

- Hình thức đơn giản nhất của thư viện là tập hợp các file đối tượng “.o”

do trình biên dịch tạo ta ở bước biên dịch với tùy chọn -c

#gcc -c helloworld.c

- Lúc này trình biên dịch chưa tạo ra file thực thi mà tạo ra file đối tượng helloworld.o (file này chứa mã máy của chương trình đã được tổ chức lại

~ các file “.o” này tương tự như các file “.obj” do trình biên dịch C sinh

ra trên DOS hoặc Windows)

- Để tạo ra file thực thi, thực hiện bước cuối cùng (gọi linker ld)

#gcc helloworld.o -o helloworld

- Nếu không dùng khoá chuyển “-c” thì trình biên dịch sẽ thực hiện cả

hai bước trên đồng thời

Trang 20

4.8.1 Thư viện liên kết tĩnh

- Là các thư viện khi liên kết trình biên dịch sẽ lấy toàn bộ mã thực thi của hàm trong thư viện đưa vào chương trình chính

- Chương trình sử dụng thư viện liên kết tĩnh này chạy độc lập với thư viện sau khi biên dịch

- Tham khảo Ví dụ 4-2: fred.c

- Tham khảo Ví dụ 4-3: bill.c

- Tiến hành biên dịch để tạo ta 2 file đối tượng “.o”

#gcc -c fred.c bill.c

- Tạo file tiêu đề để khai báo các hàm nguyên mẫu của người sử dụng

- Tham khảo Ví dụ 4-4: lib.h

Trang 21

# gcc program.o bill.o fred.o –o program

# ar –cvr libfoo.a bill.o fred.o

# gcc program.c –o program –L -lfoo

Trang 22

4.8.2 Thư viện liên kết động

4.8.2.1 Tạo và sử dụng thư viện liên kết động so

- Thư viện liên kết tĩnh có nhược điểm:

 Phải “nhúng” mã nhị phân kèm theo chương trình khi liên kết, dẫn đến tình trạng tốn không gian đĩa nếu như có chương trình yêu cầu

sử dụng một hàm nhiều lần (ví dụ như hàm printf())

 Phải biên dịch và/hoặc liên kết lại khi muốn nâng cấp (hoặc bổ

sung tính năng mới)

- Thư viện liên kết động khắc phục được hai vấn đề trên do các hàm thư viện liên kết động được nạp trong thời gian thi hành và có thể được dùng chung giữa nhiều tiến trình

Để đưa hàm vào thư viện liên kết động  cần dùng tùy chọn -fpic (hoặc

–fPIC), viết tắt của Position Independence Code

Trang 23

- Ví dụ sau sẽ biên dịch fred.c và bill.c thành các tập tin o có khả năng

đưa được vào thư viện liên kết động:

# gcc -c -fpic fred.c bill.c

- Tiếp đến tạo thư viện liên kết động từ các file đối tượng “.o” trên bằng cách sử dụng tùy chọn “-shared” (do thư viện liên kết động được tạo phụ

thuộc vào kiến trúc của HĐH):

# gcc -shared bill.o fred.o -o libfoo.so

- Cách sử dụng thư viện liên kết động với chương trình chính:

# gcc program.c -o program -L -lfoo

- Với các tuỳ chọn “-L.” và “-lfoo” trình biên dịch và liên kết gcc sẽ tìm

thư viện libfoo.so hoặc libfoo.a trong thư mục hiện hành và tạo ra file

thực thi program.

- Thư viện “.so” được ưu tiên sử dụng so với “.a” Nếu không tìm thấy file thư viện “.so” trên thì “.a” mới được xem xét đến.

Trang 24

Ví dụ minh họa về thư viện liên kết trên Windows

== - -==

Trang 25

4.8.2.2 Thục thi gọi liên kết muộn

- Thư viện liên kết động phải nằm trong /lib, /usr/lib, /usr/local/lib hoặc

thư mục với đường dẫn chỉ bởi biến môi trường LD_LIBRARY_PATH

- Ví dụ:

# export LD_LIBRARY_PATH=/myprog/lib:/other/lib:

# /program

- Có thể chủ động gọi và nạp các hàm thư viện liên kết động mà không

- Ba hàm liên kết muộn chính là:

 dlopen()

 dlsym()

 dlclose()

Trang 26

- Các hàm trên được khai báo như sau:

#include <dlfcn.h>

void *dlopen (const char* lib_file, int mode);

void *dlsym (void * handle, const char* funct_name); int dlclose (void *handle);

Trang 28

Chương 5: Xử lý tập tin và thư mục

Bao g m các ph n sau: ồm các phần sau: ần sau:

1 H th ng t ện liên kết trên Linux ống t ập tin trong Linux

2 Các cách x lý ử lý tập tin trong Linux

3 Th vi n xu t nh p chu n (Standard I/O Library) ư ện liên kết trên Linux ất với thư viện liên kết tĩnh: ập trình trên Linux ẩn (Standard I/O Library)

4 Hàm truy xu t c p th p ất với thư viện liên kết tĩnh: ất với thư viện liên kết tĩnh: ất với thư viện liên kết tĩnh:

5 X lý th m c ử lý ư ục

Trang 29

5.1 Hệ thống tập tin trong Linux

- Tất cả các tập tin và thư mục được tổ chức theo dạng cây duy nhất

- Gốc của cây thư mục gọi là root và được ký hiệu là “/”

- Cho dù máy tính có nhiều ổ đĩa (hoặc nhiều phân vùng, nhiều thiết bị)  tất cả được kết gán vào các nhánh của cây thư mục chính

- Thao tác kết gán được thực hiện bởi lệnh mount

- Hình 5-1 cho thấy thư mục /home/soft là thư mục được gán kết với

một phân vùng của Đĩa cứng thứ 2

Trang 30

- Thực tế, thư mục trong Linux được xem như một tập tin có thuộc tính

Trang 31

Hình 5.1.a

Một cấu trúc thư mục trong Linux

Trang 32

5.2 Các cách xử lý tập tin trong Linux

- Có hai cách truy xuất file:

 Truy xuất file sử dụng vùng đệm (stream file): Dựa vào các hàm

thư viện chuẩn stdio

 Truy xuất file cấp thấp (low-level): Dựa vào các lời gọi hệ thống

- Hình 5.2 là mô hình truy xuất phần cứng dựa vào thư viện chuẩn và các lời gọi hệ thống

Trang 33

Hình 5.2

Cách triệu gọi và truy xuất thiết bị phần cứng

Trang 34

5.3 Thư viện xuất nhập chuẩn (Standard I/O Library)

- Được khai báo trong stdio.h

- Thư viện này tuân theo chuẩn ANSI  có thể sử dụng chúng hầu như

5.3 Thư viện xuất nhập chuẩn (Standard I/O Library)

- Được khai báo trong stdio.h

- Thư viện này tuân theo chuẩn ANSI  có thể sử dụng chúng hầu như

Trang 35

if (!f_read) { /*Không mở được tập tin*/

perror(“Khong mo duoc file de doc ”);

exit(1);

}

Trang 36

/* Mở tập tin logfile trong thư mục hiện hành để ghi

Nếu chưa có, tập tin mới được tạo; Nếu đã có, nội dung cũ bị xóa

Trang 37

5.3.2 Đọc từ tập tin

- Sau khi mở tập tin và có con trỏ đến cấu trúc FILE, có thể thực hiện

việc đọc dữ liệu bằng nhiều hàm thư viện

- Ví dụ:

int c;

char buf[200];

c=fgetc(f_read); // Đọc 1 ký tự hoặc được EOF

if (fread(buf, 120, 1, f_read) != 1) { // Đọc 1 khối ký tự

Trang 38

5.3.3 Ghi vào tập tin

- Giả sử f_readwrite là con trỏ đến cấu trúc FILE đã được fopen() với

// Ghi một chuỗi ký tự ra tập tin

strcpy(buf, “Hello World !”);

fputs(buf, f_readwrite);

// Đẩy dữ liệu còn lại trong vùng đệm ra tập tin

Trang 39

5.3.4 Di chuyển vị trí đọc/ghi trong tập tin

- Dùng hàm fseek() phối hợp với ftell()

- Ví dụ:

fseek(f_read, 20L, SEEK_SET); // Chuyển đến vị trí 20

fseek(f_read, 10L, SEEK_CUR); // Đi 10 vị trí tính từ vị trí hiện thời // Ghi nhớ vị trí hiện thời Chuyển đến vị trí cách cuối file 50 byte

// Ghi chuỗi Hello World ! kể từ vị trí đó, sau đó về chỗ cũ

long old_position=ftell(f_readwrite);

if (fseek(f_readwrite, -50L, SEEK_END) < 0){

perror(“Không chuyển đến được !”); exit(1);

}

fputs(“Hello World !”, f_readwrite);

fseek(f_readwrite, old_position, SEEK_SET) ;

Trang 43

5.4.2 Kiểm tra quyền trên tập tin

Hàm access() dùng kiểm tra quyền truy cập tập tin:

#include <unistd.h>

// Kiểm tra quyền đọc/ghi

if (access(“/data/data.db”, R_OK | W_OK) == 0)

printf(“Có quyền Đọc-Ghi”);

else

printf(“Không có quyền Đọc-Ghi”);

Trang 44

5.4.3 Thiết lập quyền trên tập tin

Hàm chmod() dùng để thiết lập quyền truy cập tập tin:

#include <sys/types.h>

#include <sys/stat.h>

// Cho phép Chủ sở hữu quyền Đọc-Ghi

if (chmod(“/data/data.db”, S_IRUSR | S_IWUSR|S_IRGRP|S_IWOTH) == -1){

perror(“Không thiết lập quyền được !”);

else

printf(“Thiết lập quyền được ”);

Trang 45

5.4.4 Lấy thông tin về tập tin

Hàm stat() dùng để lấy thông tin về tập tin:

if (S_ISLNK(file_status.st_mode)) printf(“Soft Link !”);

if (S_ISREG(file_status.st_mode)) printf(“Normal File!”);

}

else perror(“Không xác định được trạng thái !”)

Trang 46

5.4.5 Đổi tên tập tin

Trang 48

5.5 Xử lý thư mục

Linux có các hàm riêng dùng để xử lý thư mục:

#include <sys/types.h>

#include <dirent.h>

// Mở thư mục với kết quả là con trỏ tới cấu trúc DIR

DIR *opendir(const char * name);

// Đọc một đầu mục

struct dirent readdir(DIR *dirp);

// Đóng thư mục

int closedir(DIR *dirp);

// Vị trí hiện hành của con trỏ đầu mục

long int telldir(DIR *dirp);

Trang 49

// Chuyển đến đầu mục theo số hiệu

long int seekdir(DIR *dirp, long int loc);

int rmdir(const char *path);

// Chuyển đổi thư mục làm việc

int chdir(const char *path);

// Nhận đường dẫn của thư mục làm việc (hiện thời)

char *getcwd(char *buff, size_t size);

Trang 51

Bao g m các ph n sau: ồm các phần sau: ần sau:

1 Đối số truyền cho chương trình

2 Biến môi trường

3 Thời gian và ngày tháng

Trang 52

6.1 Đối số truyền cho chương trình

6.1.1 Phân tích đối số dòng lệnh

Chuơng trình chính viết bằng C có thể chứa hàm main() với đặc tả:

int main(int argc, char *argv[])

Đối số trên dòng lệnh thường dùng để truyền thông tin từ ngoài vào:

# args –i –lrv ‘Hi Linux’ –f “/data/vb.txt”

Chương trình sau in ra tất cả các giá trị đối số mà hàm main() nhận được:

Trang 54

6.1.2 Hàm getopt()

Hữu ích cho việc phân tích đối số dòng lệnh Ví dụ:

getopt(argc, argv, “if:lr”);

sẽ phân tích và xem –i, -l, -r, -f là các tùy chọn, trong đó –f có dữ liệu kèm theo

Trang 57

6.2 Biến môi trường

Truy xuất và thiết lập biến môi trường bằng các hàm:

#include <stdlib.h>

char *getenv(const char *name);

int putenv(const char *string);

Trong đó, name chứa tên biến môi trường cần truy xuất, string

chứa chuỗi theo mẫu: varname=value

Trang 58

6.3 Thời gian và ngày tháng

- Lấy về giá trị thời gian ở cấp thấp (số giây kể từ 0 giờ 1970)

bằng hàm time():

#include <time.h>

time_t time(time_t *loc);

Trong đó, loc là tham biến dùng nhận kết quả trả về của hàm

- So sánh giữa 2 thời điểm bằng hàm difftime():

#include <time.h>

double difftime(time_t time1, time_t time2);

Ngày đăng: 08/05/2014, 14:53

TỪ KHÓA LIÊN QUAN