Th
Th
ự
ự
c
c
h
h
à
à
nh
nh
UNIX/Linux
UNIX/Linux
-
-
ph
ph
ầ
ầ
n
n
2
2
-
-
2.2
Khoa Công ngh
Khoa Công ngh
ệ
ệ
Các lệnh thao tác với process
Lập trình process với fork(), exec…()
2.3
Khoa Công ngh
Khoa Công ngh
ệ
ệ
Thông tin
Thông tin
-
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Qu
Qu
á
á
tr
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
B
B
ộ
ộ
công
công
c
c
ụ
ụ
ph
ph
á
á
t
t
tri
tri
ể
ể
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Tr
Tr
ì
ì
nh
nh
biên
biên
d
d
ị
ị
ch
ch
GNU C/C++
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
GNU C/C++ compiler (
GNU C/C++ compiler (
gcc/g
gcc/g
++)
++)
.c,.cc
.c,.cc
source codes
.cpp
gcc -E hello.c -o hello.cpp
e.g. hello.c
hello.cpp
hello.o
preprocessed
source files
object
code
gcc -x assembler -c hello.s [-o hello.o]
b.o
a.o
.s
gcc -x cpp-output -S hello.cpp [-o hello.s]
assembly
source code
T
T
ó
ó
m
m
t
t
ắ
ắ
t
t
m
m
ộ
ộ
t
t
s
s
ố
ố
t
t
ù
ù
y
y
ch
ch
-g Chèn thêm mã phụcvụ công việcdebug
-E Chỉ thựchiệnbướctiềnxử lý (preprocessing) mà không biên dịch
-S Chỉ dịch sang mã hợpngữ chứ không linking (i.e. chỉ tạo ra file *.s)
-lfoo Link với file thư việncótênlàlibfoo (e.g. -lm, -lpthread)
-ansi Biên dịch theo chuẩn ANSI C/C++ (sẽ cảnh báo nếu code không chuẩn)
2.8
Khoa Công ngh
Khoa Công ngh
ệ
ệ
Thông tin
Thông tin
-
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Biên
Biên
ệ
Thông tin
Thông tin
-
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Biên
Biên
d
d
ị
ị
ch
ch
chương
chương
tr
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Biên
Biên
d
d
ị
ị
ch
ch
chương
chương
tr
tr
ì
ì
nh
nh
C/C++ (
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Biên
Biên
d
d
ị
ị
ch
ch
chương
chương
tr
tr
ì
ì
nh
nh
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Biên
Biên
d
d
ị
ị
ch
ch
chương
chương
tr
tr
ì
ì
nh
nh
C/C++ (
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Thư
Thư
vi
vi
ệ
ệ
n
n
l
l
ậ
ậ
p
p
tr
tr
ì
ì
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Thư
Thư
vi
vi
ệ
ệ
n
n
l
l
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
trong
trong
c
lo
lo
ạ
ạ
i
i
thư
thư
vi
vi
ệ
ệ
n
n
l
l
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
Archives (static library)
Là tậphợp các file object tạo thành mộtfile đơnnhất
Tương tự file .LIB trên Windows
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
C
C
á
á
c
c
lo
lo
ạ
ạ
i
i
thư
thư
vi
vi
ệ
ệ
n
n
l
l
Thông tin
Thông tin
-
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
C
C
á
á
c
c
lo
lo
ạ
ạ
i
i
exit(0);
}
Biên dịch không có link thư việntĩnh libab.a
$ gcc myapp.c
/tmp/cc2dMic1.o: In function `main':
/tmp/cc2dMic1.o(.text+0x7): undefined reference to `func1'
collect2: ld returned 1 exit status
Biên dịch có link đếnthư việntĩnh libab.a
$ gcc -o myapp myapp.c -L. -lab hoặc gcc -o myapp myapp.c libab.a
$ ./myapp
Ke^'t qua? du`ng ha`m func1: 7
2.18
Khoa Công ngh
Khoa Công ngh
ệ
ệ
Thông tin
Thông tin
-
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
p
tr
tr
ì
ì
nh
nh
Thư việnliênkết động (dynamic, shared library)
Tương tự thư việndạng .DLL của Windows
Thư mụcchứathư việnchuẩn
/usr/lib, /lib
Tạothư việnliênkết động libab.so từ a.c và b.c
1. Biên dịch tạo các file object có dùng tùy chọn-fPIC
$ gcc -c -fPIC a.c b.c
2. Tạothư việnliênkết động tên là libab.so
$ gcc -shared -fPIC -o libab.so a.o b.o
3. Có thể dùng lệnh file để xem file libab.so là loại file gì
$ file libab.so
libab.so: ELF 32-bit LSB shared object, Intel 80386, version 1
(SYSV), not stripped
2.19
Khoa Công ngh
Khoa Công ngh
ệ
ệ
Thông tin
Thông tin
-
-
ệ
ệ
n
n
l
l
ậ
ậ
p
p
tr
tr
ì
ì
nh
nh
(
(
t.t
t.t
)
)
Tạo ứng dụng vớifile myapp.cnhư ví dụ trước
Biên dịch link vớithư việntĩnh libab.so
$ gcc myapp.c
/tmp/cc2dMic1.o: In function `main':
/tmp/cc2dMic1.o(.text+0x7): undefined reference to `func1'
collect2: ld returned 1 exit status
Biên dịch có link đếnthư việntĩnh libab.a
C
á
á
c
c
lo
lo
ạ
ạ
i
i
thư
thư
vi
vi
ệ
ệ
n
n
l
l
ậ
ậ
p
p
tr
tr
ì
ì
nh
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
C
C
á
á
c
c
lo
lo
ạ
ạ
i
i
thư
thư
vi
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Trong thư mụchiệntạicó2 thư viện là libab.a và libab.so. Khi đó,
linker sẽưu tiên liên kếtthư viện.so trước. Muốnchỉđịnh buộc
linker tiếnhànhliên kếttĩnh vớithư viện libab.a thì thêm tùy
chọn-static
$ mv libab.so libab.so.old
$ gcc -static -o myapp myapp.c -L. -lab
$ ./myapp
Ke^'t qua? du`ng ha`m func1 7
2.22
Khoa Công ngh
Khoa Công ngh
ệ
ệ
Thông tin
Thông tin
-
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ệ
Thông tin
Thông tin
-
-
Đ
Đ
ạ
ạ
i h
i h
ọ
ọ
c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Theo
Theo
dõi
dõi
c
c
á
á
c
c
process
ch Khoa Tp. HCM
ch Khoa Tp. HCM
Th
Th
ự
ự
c
c
thi
thi
foreground process
foreground process
Khi gõ lệnh tương ứng vớitênchươngtrìnhtheocáchthông
thường
Khi click vào icon trên giao diện đồ hoạ tương ứng vớichương
trình.
Chương trình chạymặttiềntương tác đượcvớingười dùng
qua thiếtbị nhậpchuẩn (standard input) là bàn phím.
Kếtxuấtcủachương trình chủ yếulàthiếtbị xuấtchuẩn
(standard output) là màn hình.
Trình thông dịch lệnh sẽ bị blocked cho tới khi foreground
process kết thúc
2.25
Khoa Công ngh
Khoa Công ngh
ệ
ệ
Thông tin
Thông tin
-
ự
c
c
thi
thi
foreground process
foreground process
Dùng tổ hợpphímCtrl-C
Ví dụ:
$find / -name “*.ps” -print^C