Tải bản đầy đủ (.pdf) (74 trang)

Thực hành UNIX/Linux - phần 2 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.72 MB, 74 trang )

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



Thông tin
Thông tin
-
-
Đ
Đ


i h
i h


c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
N
N


i
i
dung
dung
 Biên dịch và thựcthichương trình C/C++
 Giớithiệuvề process
 Tổ chứccủamột process
 Background và foreground process

 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

tr
ì
ì
nh
nh
t
t


o
o
process
process
.c, .cpp, .cc
gas/gcc/g++
.o
gcc/g++
2.4
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
B
B


công
công
c
c


ph
ph
á
á
t
t
tri
tri



n
n


ng
ng
d
d


ng
ng
GNU
GNU
 GNU Compiler Collection (GCC)
 Thư việncáchàmtiện ích: libc, libstdc++, …
 Các trình biên dịch gcc, g++, gcj, gas, …
 Trình khử lỗigdb
 Trình tiện ích khác trong binutils như nm, strip, ar, objdump,
ranlib (dùng lệnh info binutils để xem thêm)
 Tiệních: gmake
 …
2.5
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
Tr
Tr
ì
ì
nh
nh
biên
biên
d
d


ch
ch
GNU C/C++

GNU C/C++
 Công cụ dùng biên dịch các chương trình C/C++
 Quá trình biên dịch thành file thựcthigồm 4 giai đoạntheothứ
tự như sau:
1. preprocessing (tiềnxử lý)
2. compilation (biên dịch)
3. assembly (hợpdịch)
4. linking (liên kết)
 Ba bước 1, 2, 3 chủ yếulàmviệcvớimộtfile đầuvào
 Bước4 cóthể liên kết nhiều object module liên quan để tạo
thành file thực thi nhị phân (executable binary)
 Lậptrìnhviêncóthể can thiệpvàotừng bước ở trên ☺
2.6
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
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

a.out/hello
gcc -S hello.c [-o hello.s]
gcc a.o b.o hello.o [-o hello]
gcc -c hello.c [-o hello.o]
gcc hello.c [-o hello]
executable
binary
2.7
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

T
T
ó
ó
m
m
t
t


t
t
m
m


t
t
s
s


t
t
ù
ù
y
y
ch
ch



n
n
c
c


a
a
gcc
gcc
Tùy chọn Công dụng
-o FILE
Chỉđịnh tên của file output (khi biên dịch thành file thựcthi, nếu không
có -o filename thì tên file mặc định sẽ là a.out)
-c Chỉ biên dịch mà không linking (i.e. chỉ tạo ra object file *.o)
-I
DIRNAME
Chỉ tên thư mục
DIRNAME
là nơichứa các file header (.h) mà gcc sẽ tìm
trong đó(mặc định gcc sẽ tự tìm ở các thư mụcchuẩn/usr/include, …)
-L
DIRNAME
Chỉ tên thư mục
DIRNAME
là nơichứacácthư viện (.a, .so) mà gcc sẽ tìm
trong đó(mặc định gcc sẽ tự tìm ở các thư mụcchuẩn/usr/lib, …)
-O [n] Tối ưumãthựcthitạo ra (e.g. -O2, -O3, hoặc-O)

-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

d
d


ch
ch
chương
chương
tr
tr
ì
ì
nh
nh
C/C++
C/C++
File main.c
#include <stdio.h>
#include "reciprocal.h"
int main (int argc, char **argv)
{
int i;
i = atoi (argv[1]);
printf ("The reciprocal of %d is %g\n", i, reciprocal (i));
return 0;
}
2.9
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
d
d


ch
ch
chương
chương
tr

tr
ì
ì
nh
nh
C/C++ (
C/C++ (
t.t
t.t
)
)
File reciprocal.h
extern double reciprocal (int i);
File reciprocal.c
#include <assert.h> /* some debug routines here */
#include "reciprocal.h"
double reciprocal (int i) {
assert (i != 0); /* used for debugging */
return 1.0/i;
}
2.10
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
d
d


ch
ch
chương
chương
tr
tr
ì
ì
nh
nh
C/C++ (

C/C++ (
t.t
t.t
)
)
 Biên dịch (không link) mộtfile chương trình nguồnC đơnlẻ
gcc -c main.c
 Kếtquả là object file tên main.o

Biên dịch (không link) file chương trình nguồnC++
g++ -c myprog.cpp
 Kếtquả là file object tên là myprog.o

Biên dịch (không link) main.c có sử dụng các file *.h trong thư
mục include/ (dùng tùy chọn-I để chỉđịnh đường dẫn)
gcc -c -I /include reciprocal.c
 Biên dịch (không link) có tối ưumã
gcc -c -O2 main.c
 Biên dịch có kèm thông tin phụcvụ debug => kích thướcfile
output lớn
gcc -g reciprocal.c
2.11
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
d
d


ch
ch
chương
chương
tr
tr
ì
ì
nh
nh

C/C++ (
C/C++ (
t.t
t.t
)
)
 Liên kết (link) nhiềufile đốitượng (object files) đãcó
g++ -o myapp main.o reciprocal.o
gcc -o myapp main.o reciprocal.o
 Tên file tạoralàgì? Chobiếtquyềnhạntrênfile đó?
 Thựcthitạidấunhắclệnh: $ ./myapp 3
 Liên kếtobject files vớicácthư viện (libraries) khác
-Liênkếtvớithư việnchuẩn POSIX pthread (/usr/lib/libpthread.so)
gcc -o myapp main.o
-lpthread
-Liênkếtvớithư viện libutility.a ở thư mục /usr/local/lib/somelib
gcc -o myapp main.o
-L/usr/local/lib/somelib -lutility
-Liênkếtvớithư viện libtest.so ở thư mụclàmviệchiệnhành
gcc -o myapp main.o -L . -ltest
2.12
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
d
d


ch
ch
chương
chương
tr
tr
ì
ì
nh
nh
C/C++ (

C/C++ (
t.t
t.t
)
)
 Lưuý khibiêndịch trong Linux
 Dùng g++ nếuchương trình có chứamãC lẫn C++
 Dùng gcc nếuchương trình chỉ có mã C
 File thựcthitạorakhôngcóđuôi.exe, .dllnhư môi trường
Windows.

Giả sửứng dụng củabạngồmnhiềuhơnmột file source code,
e.g main.c và reciprocal.c. Để tạothànhchương trình thực
thi, bạncóthể biên dịch trựctiếpbằng mộtlệnh gcc như sau:
gcc-o myappmain.creciprocal.c

Cách làm thủ công như trên sẽ bấttiện và không hiệuquả khi
ứng dụng gồm quá nhiềufile (khoảng >10 files ??? ).
 Tham khảothêmcôngcụ rấthữuíchlàGNU make.
2.13
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
Thư
Thư
vi
vi


n
n
l
l


p
p
tr
tr
ì
ì

nh
nh
trong
trong
Linux
Linux
Libraries
Libraries
Libraries
Libraries
statically
linking
dynamically
linking
Cho biết ưuvàkhuyết điểmcủa statically vs. dynamically linking?
2.14
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
Thư
Thư
vi
vi


n
n
l
l


p
p
tr
tr
ì
ì
nh
nh
trong
trong

Linux
Linux
2.15
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
C
C
á
á
c

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

 Khi bạnchỉđịnh liên kết ứng dụng củamìnhvớimột static library
thì linker sẽ tìm trong thư viện đó để trích xuấtnhững file object mà
bạncần. Sau đó, linker sẽ tiếnhànhliênkết các file object đóvào
chương trình củabạn.

Cách thứctạothư việntĩnh (archive file)
 Giả sử bạn có hai file mã nguồnchứa hàm là a.c và b.c
a.c
int func1(){
return 7;
}
b.c
double func2(){
return 3.14159;
}
2.16
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
C
C
á
á
c
c
lo
lo


i
i
thư
thư
vi
vi


n
n
l
l



p
p
tr
tr
ì
ì
nh
nh
(
(
t.t
t.t
)
)
 Tạothư việntĩnh tên là libab.a
1. Biên dịch tạo các file object
$ gcc -c a.c b.c
2. Dùng lệnh ar để tạo thành thư việntĩnh tên là libab.a
$ ar cr libab.a a.o b.o
3. Có thể dùng lệnh nm để xem lạikếtquả
$ nm libab.a
4. Có thể dùng lệnh file để xem file libab.a là loại file gì
$ file libab.a
2.17
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
C
C
á
á
c
c
lo
lo


i
i

thư
thư
vi
vi


n
n
l
l


p
p
tr
tr
ì
ì
nh
nh
(
(
t.t
t.t
)
)
 Tạo ứng dụng đơngiảncósử dụng hàm thư việntronga.c
myapp.c
int main(){
printf("Ke^'t qua? du`ng ha`m func1: %d\n", func1());

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

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


p

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

Đ
Đ


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
vi



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

$ gcc -o myapp myapp.c -L. -lab
hoặc gcc -o myapp myapp.c libab.so
$ ./myapp
./myapp: error while loading shared libraries: libab.so: cannot open
shared object file: No such file or directory
Tại sao???
2.20
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
C

C
á
á
c
c
lo
lo


i
i
thư
thư
vi
vi


n
n
l
l


p
p
tr
tr
ì
ì
nh

nh
(
(
t.t
t.t
)
)
 Nguyên nhân: do loader tìm trong thư mụcthư việnchuẩnnhư
/usr/lib, /lib không có libab.so !!!
 Cách giảiquyết(cũng là cách dùng để triển khai - deploy, một
ứng dụng có sử dụng thư viện liên kết động)
1. Nếucóđủ quyềnhạn (e.g. root) thì copy các file thư việnchiasẻ và
thư mụcchuẩn
# cp libab.so /lib
$ ./myapp
Ke^'t qua? du`ng ha`m func1: 7
2. Nếu không có đủ quyềnhạn copy file vào thư mụcchuẩn, user phải
thay đổibiếnmôitrường LD_LIBRARY_PATH để chỉ cho loader tìm
trong thư mụcchứathư viện.
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$ ./myapp
Ke^'t qua? du`ng ha`m func1: 7
2.21
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
C
C
á
á
c
c
lo
lo


i
i
thư
thư
vi

vi


n
n
l
l


p
p
tr
tr
ì
ì
nh
nh
(
(
t.t
t.t
)
)
 Mộtsố chú ý khi lậptrìnhvớithư việnliênkết động
 Kiểmtraxemứng dụng cuốicùngcủamìnhtạoraphụ thuộcvào
các thư viện liên kết động nào bằng lệnh ldd. Nếubị thiếuthư viện
thì phảikhắcphục theo 2 cách ở trên
$ ldd myapp
libab.so => not found
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)

/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
á
á

ch Khoa Tp. HCM
ch Khoa Tp. HCM


b
b


n
n
v
v


PROCESS
PROCESS
 Process: chương trình đang thựcthi.
 User có thể theo dõi trạng thái của process, tương tác
với process
 Có hai loại user process chủ yếutronghệ thống

Foreground process

Background process
 Các “process” thựchiệncáccôngviệccủahệđiều
hành còn gọi là các kernel_thread, daemon
2.23
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
Theo
Theo
dõi
dõi
c
c
á
á
c
c
process

process
 Xem trạng thái các process (process status)
ps [option]
 Options
-e
chọntất các process
-f liệtkêtấtcả (full) các thuộctính
-A liệtkêtấtcả processs

2.24
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
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
-

-
Đ
Đ


i h
i h


c B
c B
á
á
ch Khoa Tp. HCM
ch Khoa Tp. HCM
K
K
ế
ế
t
t
th
th
ú
ú
c
c
th
th



c
c
thi
thi
foreground process
foreground process
 Dùng tổ hợpphímCtrl-C
Ví dụ:
$find / -name “*.ps” -print


^C

×