Anda di halaman 1dari 74

Th

Th

c
c
h
h

nh
nh
UNIX/Linux
UNIX/Linux
-
-
ph
ph

n
n
2
2
-
-
2.2
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
N
N

i
i
dung
dung
Bin dch v thc thi chng trnh C/C++
Gii thiu v process
T chc ca mt process
Background v foreground process
Cc lnh thao tc vi process
Lp trnh process vi fork(), exec()
2.3
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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 Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
B
B

cng
cng
c
c

ph
ph

t
t
tri
tri

n
n

ng
ng
d
d

ng
ng
GNU
GNU
GNU Compiler Collection (GCC)
Th vin cc hm tin ch: libc, libstdc++,
Cc trnh bin dch gcc, g++, gcj, gas,
Trnh kh li gdb
Trnh tin ch khc trong binutils nh nm, strip, ar, objdump,
ranlib (dng lnh info binutils xem thm)
Tin ch: gmake

2.5
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Tr
Tr

nh
nh
bin
bin
d
d

ch
ch
GNU C/C++
GNU C/C++
Cng c dng bin dch cc chng trnh C/C++
Qu trnh bin dch thnh file thc thi gm 4 giai on theo th
t nh sau:
1. preprocessing (tin x l)
2. compilation (bin dch)
3. assembly (hp dch)
4. linking (lin kt)
Ba bc 1, 2, 3 ch yu lm vic vi mt file u vo
Bc 4 c th lin kt nhiu object module lin quan to
thnh file thc thi nh phn (executable binary)
Lp trnh vin c th can thip vo tng bc trn
2.6
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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 Cng ngh Khoa Cng ngh Thng tin Thng 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
Ty chn Cng dng
-o FILE
Ch nh tn ca file output (khi bin dch thnh file thc thi, nu khng
c -o filename th tn file mc nh s l a.out)
-c Ch bin dch m khng linking (i.e. ch to ra object file *.o)
-IDIRNAME
Ch tn th mc DIRNAME l ni cha cc file header (.h) m gcc s tm
trong (mc nh gcc s t tm cc th mc chun /usr/include, )
-LDIRNAME
Ch tn th mc DIRNAME l ni cha cc th vin (.a, .so) m gcc s tm
trong (mc nh gcc s t tm cc th mc chun /usr/lib, )
-O [n] Ti u m thc thi to ra (e.g. -O2, -O3, hoc -O)
-g Chn thm m phc v cng vic debug
-E Ch thc hin bc tin x l (preprocessing) m khng bin dch
-S Ch dch sang m hp ng ch khng linking (i.e. ch to ra file *.s)
-lfoo Link vi file th vin c tn l libfoo (e.g. -lm, -lpthread)
-ansi Bin dch theo chun ANSI C/C++ (s cnh bo nu code khng chun)
2.8
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Bin
Bin
d
d

ch
ch
chng
chng
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 Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Bin
Bin
d
d

ch
ch
chng
chng
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 Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Bin
Bin
d
d

ch
ch
chng
chng
tr
tr

nh
nh
C/C++ (
C/C++ (
t.t
t.t
)
)
Bin dch (khng link) mt file chng trnh ngun C n l
gcc -c main.c
Kt qu l object file tn main.o
Bin dch (khng link) file chng trnh ngun C++
g++ -c myprog.cpp
Kt qu l file object tn l myprog.o
Bin dch (khng link) main.c c s dng cc file *.h trong th
mc include/ (dng ty chn -I ch nh ng dn)
gcc -c -I ../include reciprocal.c
Bin dch (khng link) c ti u m
gcc -c -O2 main.c
Bin dch c km thng tin phc v debug => kch thc file
output ln
gcc -g reciprocal.c
2.11
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Bin
Bin
d
d

ch
ch
chng
chng
tr
tr

nh
nh
C/C++ (
C/C++ (
t.t
t.t
)
)
Lin kt (link) nhiu file i tng (object files) c
g++ -o myapp main.o reciprocal.o
gcc -o myapp main.o reciprocal.o
Tn file to ra l g ? Cho bit quyn hn trn file ?
Thc thi ti du nhc lnh: $ ./myapp 3
Lin kt object files vi cc th vin (libraries) khc
- Lin kt vi th vin chun POSIX pthread (/usr/lib/libpthread.so)
gcc -o myapp main.o -lpthread
- Lin kt vi th vin libutility.a th mc /usr/local/lib/somelib
gcc -o myapp main.o
-L/usr/local/lib/somelib -lutility
- Lin kt vi th vin libtest.so th mc lm vic hin hnh
gcc -o myapp main.o -L . -ltest
2.12
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Bin
Bin
d
d

ch
ch
chng
chng
tr
tr

nh
nh
C/C++ (
C/C++ (
t.t
t.t
)
)
Lu khi bin dch trong Linux
Dng g++ nu chng trnh c cha m C ln C++
Dng gcc nu chng trnh ch c m C
File thc thi to ra khng c ui .exe, .dll nh mi trng
Windows.
Gi s ng dng ca bn gm nhiu hn mt file source code,
e.g main.c v reciprocal.c. to thnh chng trnh thc
thi, bn c th bin dch trc tip bng mt lnh gcc nh sau:
gcc -o myapp main.c reciprocal.c
Cch lm th cng nh trn s bt tin v khng hiu qu khi
ng dng gm qu nhiu file (khong >10 files ??? ).
Tham kho thm cng c rt hu ch l GNU make.
2.13
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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 bit u v khuyt im ca statically vs. dynamically linking?
2.14
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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 Cng ngh Khoa Cng ngh Thng tin Thng 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 tp hp cc file object to thnh mt file n nht
Tng t file .LIB trn Windows
Khi bn ch nh lin kt ng dng ca mnh vi mt static library
th linker s tm trong th vin trch xut nhng file object m
bn cn. Sau , linker s tin hnh lin kt cc file object vo
chng trnh ca bn.
Cch thc to th vin tnh (archive file)
Gi s bn c hai file m ngun cha hm l a.c v b.c
a.c
int func1(){
return 7;
}
b.c
double func2(){
return 3.14159;
}
2.16
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
)
)
To th vin tnh tn l libab.a
1. Bin dch to cc file object
$ gcc -c a.c b.c
2. Dng lnh ar to thnh th vin tnh tn l libab.a
$ ar cr libab.a a.o b.o
3. C th dng lnh nm xem li kt qu
$ nm libab.a
4. C th dng lnh file xem file libab.a l loi file g
$ file libab.a
2.17
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
)
)
To ng dng n gin c s dng hm th vin trong a.c
myapp.c
int main(){
printf("Ke^'t qua? du`ng ha`m func1: %d\n", func1());
exit(0);
}
Bin dch khng c link th vin tnh 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
Bin dch c link n th vin tnh libab.a
$ gcc -o myapp myapp.c -L. -lab hoc gcc -o myapp myapp.c libab.a
$ ./myapp
Ke^'t qua? du`ng ha`m func1: 7
2.18
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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 vin lin kt ng (dynamic, shared library)
Tng t th vin dng .DLL ca Windows
Th mc cha th vin chun
/usr/lib, /lib
To th vin lin kt ng libab.so t a.c v b.c
1. Bin dch to cc file object c dng ty chn -fPIC
$ gcc -c -fPIC a.c b.c
2. To th vin lin kt ng tn l libab.so
$ gcc -shared -fPIC -o libab.so a.o b.o
3. C th dng lnh file xem file libab.so l loi file g
$ file libab.so
libab.so: ELF 32-bit LSB shared object, Intel 80386, version 1
(SYSV), not stripped
2.19
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
)
)
To ng dng vi file myapp.c nh v d trc
Bin dch link vi th vin tnh 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
Bin dch c link n th vin tnh libab.a
$ gcc -o myapp myapp.c -L. -lab
hoc 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
Ti sao???
2.20
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
)
)
Nguyn nhn: do loader tm trong th mc th vin chun nh
/usr/lib, /lib khng c libab.so !!!
Cch gii quyt (cng l cch dng trin khai - deploy, mt
ng dng c s dng th vin lin kt ng)
1. Nu c quyn hn (e.g. root) th copy cc file th vin chia s v
th mc chun
# cp libab.so /lib
$ ./myapp
Ke^'t qua? du`ng ha`m func1: 7
2. Nu khng c quyn hn copy file vo th mc chun, user phi
thay i bin mi trng LD_LIBRARY_PATH ch cho loader tm
trong th mc cha th vin.
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$ ./myapp
Ke^'t qua? du`ng ha`m func1: 7
2.21
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
)
)
Mt s ch khi lp trnh vi th vin lin kt ng
Kim tra xem ng dng cui cng ca mnh to ra ph thuc vo
cc th vin lin kt ng no bng lnh ldd. Nu b thiu th vin
th phi khc phc theo 2 cch trn
$ 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 mc hin ti c 2 th vin l libab.a v libab.so. Khi ,
linker s u tin lin kt th vin .so trc. Mun ch nh buc
linker tin hnh lin kt tnh vi th vin libab.a th thm ty
chn -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 Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C
b
b

n
n
v
v

PROCESS
PROCESS
Process: chng trnh ang thc thi.
User c th theo di trng thi ca process, tng tc
vi process
C hai loi user process ch yu trong h thng
Foreground process
Background process
Cc process thc hin cc cng vic ca h iu
hnh cn gi l cc kernel_thread, daemon
2.23
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Theo
Theo
di
di
c
c

c
c
process
process
Xem trng thi cc process (process status)
ps [option]
Options
-e chn tt cc process
-f lit k tt c (full) cc thuc tnh
-A lit k tt c processs

2.24
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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 lnh tng ng vi tn chng trnh theo cch thng
thng
Khi click vo icon trn giao din ho tng ng vi chng
trnh.
Chng trnh chy mt tin tng tc c vi ngi dng
qua thit b nhp chun (standard input) l bn phm.
Kt xut ca chng trnh ch yu l thit b xut chun
(standard output) l mn hnh.
Trnh thng dch lnh s b blocked cho ti khi foreground
process kt thc
2.25
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
Dng t hp phm Ctrl-C
V d:
$find / -name *.ps -print
...
...
^C
2.26
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
T
T

m
m
hon
hon
th
th

c
c
thi
thi
foreground process
foreground process
Dng t hp phm:
Ctrl-Z
Process tng ng chuyn sang trng thi suspended
V d
$ find / *.profile -print
...
^Z
[1]+ Stopped find / ".profile" -print
$ps
PID TTY TIME CMD
2750 pts/1 00:00:00 bash
2881 pts/1 00:00:00 find
2883 pts/1 00:00:00 ps
2.27
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
T
T

m
m
hon
hon
th
th

c
c
thi
thi
foreground
foreground
process (
process (
t.t
t.t
)
)
Sau khi b tm hon thc thi bng ^Z, chng ta c
th dng lnh ps xem. Mt lnh tin ch khc hin
th thng tin ny l jobs
Nu mun cho process tip tc thc thi foreground,
dng lnh fg n (trong n l ch s ca job hin th
trong ngoc vung, v d [1], [4], ), cn mun
process thc thi background th dng lnh bg n.
V d
$ jobs
[1]+ Stopped find / ".profile" print
$ fg 1 hoc
$ bg 1
2.28
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Th
Th

c
c
thi
thi
process
process

background
background
Thm du & (ampersand) vo cui lnh
V d:
$find /home/a* -name *.profile print > kq &
[1] 2548
Trnh thng dch lnh to ra mt process tng ng vi
chng trnh ng thi in ra job number ([n]) v
PID (Process IDentifier) ca process c to ra.
Ngay sau khi thc thi, trnh thng dch sn sng nhn
lnh mi (khng b blocked nh i vi foreground
process)
2.29
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Th
Th

c
c
thi
thi
background process
background process
Background process vn xut kt qu ra standard
output l mn hnh trong lc thc thi
cn ti nh hng standard output trnh mt d liu
xut.
Ngi dng khng th tng tc vi chng trnh qua
standard input l bn phm vi background proces
cn phi ti nh hng standard input thng qua file nu
process cn nhp d liu.
2.30
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Qu
Qu

n
n
l
l
background process
background process
Lit k cc job ang hot ng - dng lnh jobs
$jobs -l
[1] + 3584 Running xterm -g 90x55
[2] - 3587 Running xterm -g 90x55
i vi cc qu trnh, c th:
C th chuyn process t thc thi background sang foreground
v ngc li dng lnh fg hoc bg
Kt thc mt qu trnh (~ mt job)
2.31
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Chuy
Chuy

n
n
foreground
foreground
th
th

nh
nh
background
background
process
process
1. Tr hon qu trnh (bng Ctrl + Z)
2. Dng lnh bg (background) chuyn process sang
ch thc thi background.
V d:
$ls R / > kq
...
^Z
[1]+ Stopped ls R / >kq
$bg (v ch c mt jobs nn bg khng cn tham s)
[1]+ ls R / > kq &
2.32
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Chuy
Chuy

n
n
background
background
th
th

nh
nh
foreground
foreground
process
process
Dng lnh fg
fg job_number
(Nu ch c mt qu trnh chy background th lnh fg khng cn
tham s job_number)
V d:
$ls -R / > kq &
[1] 2959
$jobs
[1]+ Running ls -R / >kq &
$ fg 1
2.33
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
qu
qu

tr
tr

nh
nh
Dng lnh kill
kill [-signal] process_identifier (PID)
Cn dng lnh ps trc bit PID ca qu trnh.
C th dng lnh n gin nh sau:
kill process_identifier or
kill -9 process_identifier
2.34
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
L
L

p
p
tr
tr

nh
nh
PROCESS
PROCESS
Kin trc h thng *NIX
T chc ca process
X l tham s dng lnh (command line arguments)
To mi v kt thc process
Gi thc thi lnh/chng trnh khc bng system(),
exec()
2.35
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
S
S
l
l

c
c
v
v

*NIX
*NIX
n khi (monolithic)
a nhim (multitasking)
Nhiu ngi dng ng thi (multiuser)
a dng (general purpose)
Chia s thi gian (time-sharing)
Bo mt
2.36
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
M
M

t
t
s
s

nh
nh

nh
nh
ph
ph

t
t
tri
tri

n
n
BSD UNIX: California Univ. of Berkeley
System V: AT&T
SunOS/Solaris: Sun Microsystem
AIX: IBM Corp.
HP-UX: Hewlett-Packard
Linux: Linus Torvalds
2.37
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Ki
Ki

n
n
tr
tr

c
c
t
t

ng
ng
quan
quan
ng dng
Giao din lp
trnh
Nhn (kernel)
Phn cng
2.38
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Ki
Ki

n
n
tr
tr

c
c
lu
lu

n
n
l
l
(the users)
Shell and commands
Compilers & Interpreters
System libraries
Signals
Termial handling
Character I/O system
Terminal drivers
File system
Swapping
Block I/O system
Disk & tape drivers
CPU scheduling
Page replacement
Demand paging
Virtual memory
Terminal controllers
Terminals
Device controllers
Disks & tape
Memory controller
Physical memory
2.39
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
*NIX Kernel
*NIX Kernel
User level
System Call Interface
File System
Process
Control
System
IPC
Scheduler
Memory
Management
Device
Driver
Hardware Control
Hardware
2.40
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Kernel vs. user space
Kernel vs. user space
Kernel Space
root (0)
kswapd (5)
init (1)
sh
sh
sh
User Space
2.41
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Qu
Qu

n
n
l
l
c
c

c
c
qu
qu

tr
tr

nh
nh
a nhim
Tc v -> process.
Mi process c:
Khng gian a ch (address space)
Code thc thi
Cc vng cha d liu
Stack
Trng thi process:
registers, program counter, stack pointer,.
2.42
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Danh
Danh

nh
nh
c
c

a
a
process
process
Process identifier (PID) duy nht, tng dn t 0
Mt s PID c bit:
0: root
1: init

2.43
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
B
B

nh
nh

c
c

a
a
process
process
Text: cha chng trnh code thc thi - cha cc
cc instruction dnh cho CPU thc hin - read only.
Data: vng d liu - cha cc bin c khai bo
tnh hoc ng - xin cp pht trong lc thc thi.
Stack: cha trng thi v cc thng tin lin quan n
vic gi hm.
2.44
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

u
u
tr
tr

c
c
b
b

nh
nh

Process memory layout:


Text segment (code)
Data segment
Stack
Heap
Command-line
arguments
Environment variables
argc/argv[]
Stack segment
Heap
Text segment
Low address
High address
etext
edata
end
Initialized data
Uninitialized data
2.45
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

u
u
tr
tr

c
c
b
b

nh
nh

2.46
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM

a
a
ch
ch

b
b

nh
nh

a ch do process tham kho ch l a ch o


C th truy xut thng tin b nh qua cc bin
ton cc:
etext: a ch sau vng text
edata: a ch kt thc vng initialized data
end: a ch bt u vng heap
nh ngha macro in a ch mt bin
#define PADDR(x) printf(#x " at %u\n", &x);
2.47
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

#include <stdio.h>
#include <stdlib.h>
#define PADDR(x) printf(#x " at %u\n", &x);
extern unsigned etext, edata, end;
int a = 0, b;
int main(int argc, char *argv[]) {
printf("End of text seqment at %u\n", &etext);
printf("End of initialized statics and externals at %u\n", &edata);
printf("End of uninitialized statics and externals at %u\n", &end);
PADDR(a);
PADDR(b);
return 0;
}
2.48
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
L
L

y
y

i
i
s
s

v
v

bi
bi

n
n
mi
mi
tr
tr

ng
ng
Chng trnh C
int main(int argc, char *argv[]) {
}
Trong
int argc: s tham s ca chng trnh khi chy
char *argv[]: danh sch cc tham s
Ngoi ra, cn c cc bin ngoi (external
variable)
extern char **environ: danh sch bin mi trng
2.49
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
L
L

y
y

i
i
s
s

v
v

bi
bi

n
n
mi
mi
tr
tr

ng
ng
(
(
t.t
t.t
)
)
Gi s bn mun vit mt chng trnh tn l myapp, nhn t
dng lnh n tham s l s nguyn, chng trnh s hin th dng
thng bo cho bit s ln nht.
Gi thc thi chng trnh myapp.
$ ./myapp 12 34 56 78
The biggest integer is 78
Gi thc thi lnh du nhc
$ ./myapp 12 34 56 78
Chng trnh myapp.c
int main(int argc, char *argv[]) {
... }
argc argv
5
5 "./myapp"
"12"
"34"
"56"
"78"
2.50
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

#include <stdio.h>
#include <stdlib.h>
extern char **environ;
int main(int argc, char *argv[]) {
int i;
printf("\nNumber of arguments is %d",argc);
printf("\nArguments:\n");
for(i=0; i<argc; i++)
printf("argv[%d]=%s\n",i,argv[i]);
getchar();
for (i=0; environ[i]!=(char *)0; i++)
printf("%s\n",environ[i]);
return 0;
}
2.51
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
L
L

y
y
PID
PID
c
c

a
a
process
process
#including < #including <unistd.h unistd.h> >
pid_t getpid(void); pid_t getpid(void);
Ly PID ca process hin hnh
pid_t getppid(void); pid_t getppid(void);
Ly PID ca process cha
2.52
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

#include <stdio.h>
#include <unistd.h>
int main() {
printf("Process id: %d\n", getpid());
printf("Parent process id: %d\n", getppid());
return 0;
}
2.53
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
T
T

o
o
process
process
H iu hnh to process bng cch nhn bn mt
process ang tn ti.
Process mi c to ra gi l con (child), process kia
l process cha (parent).
Parent
Child
fork()
2.54
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
Chu
Chu
k
k

s
s

ng
ng
c
c

a
a
process
process
wait() wait()
Parent Parent
Process Process
Parent Parent
Process Process
fork() fork()
Child Child
Process Process
Child Child
Process Process
Zombie Zombie
Process Process
exec exec exit exit
2.55
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
T
T

o
o
process
process
Dng hm: pid_t fork(void);
Nu thnh cng:
tr v 0 trong thn process con
PID ca con (>0) trong thn process cha.
Nu tht bi, tr v -1 v l do km theo:
ENOMEM: khng b nh
EAGAIN: s process vt qu gii hn cho php
2.56
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

Dng mu chng trnh


pid_t pid;
pid = fork();
if (pid==0) {
// child code here
} else if (pid > 0) {
// parent code here
} else {
// error warning
}
2.57
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
T
T

o
o
process
process
Text
Data
Stack
Text
Data
Stack
Parent process
Child process
fork()
2.58
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

#include <stdio.h>
#include <unistd.h>
int main() {
int childid;
if ((childid=fork())==0) {
printf("Child process output: PID = %d\n",getpid());
printf("My parent PID is %d\n",getppid());
}else if(childid > 0) {
printf("Parent process output: PID= %d\t", getpid());
printf("Child PID=%d\n", childid);
}else {
printf("Fork error !\n");
exit(1);
}
return 0;
}
2.59
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
process
process
Dng system call exit():
Orphaned process: process cha kt thc trc
process con sau s c cha l init (PID=1)
Zombied process
Process kt thc nhng cha bo trng thi cho
process cha bit.
Dng hm wait() hay waitpid() process cha
ly trng thi tr v t process con.
2.60
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
process
process
waitpid() system call:
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *stat_loc, int options);
(Tr v PID ca process con kt thc, hoc -1 nu tht bi)
i s pid :
<-1: i cc process con c process group ID bng vi PID ca n
= -1: i bt k cc process con no
= 0: i bt k cc process con no c process group ID bng vi
PID ca n.
> 0: i pocess c PID bng vi gi tr ny
2.61
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
process
process
wait() system call:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *stat_loc);
Tham kho thm man pages ca system call waitpid(),
wait()
2.62
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

#include <stdio.h>
#include <unistd.h>
#define PROCESSES 3 /*Number of processes */
int main( int argc, char *argv[]) {
int count, retval, child_no;
/*Creating processes*/
retval = 1;
for( count = 0; count < PROCESSES; count++
) {
if( retval != 0 ) retval = fork();
else break;
}
2.63
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

(
(
ti
ti

p
p
theo
theo
)
)
/* Execution of child processes */
if( retval == 0 ) {
child_no = count;
printf("Child #%d has PID (process-id):#%d\n",
getpid());
sleep(rand()%5);
}
else {
/* Waiting for children termination */
for( count = 0; count < PROCESSES; count++ )
wait(NULL);
}
return 0;
}
2.64
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

c
c
h
h

m
m
g
g

i
i
th
th

c
c
thi
thi
chng
chng
tr
tr

nh
nh
int system (const char *string);
int execl (const char *path, const char *arg, ...)
int execv (const char *path, const char *argv[ ])
int execlp (const char *lename, const char *arg, ...)
int execvp (const char *lename, const char *argv[ ])
int execle (const char *path, const char *arg, ..., const char
**env)
int execve (const char *path, const char *argv[ ], const char
**env)
2.65
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
int
int
system(const
system(const
char *string)
char *string)
X l mt lnh c ch ra trong thng s string v tr v sau khi lnh
c thc thi xong
Thc cht th li gi hm system(string) s thc hin lnh sh -c
string (trong sh l shell, trong Linux sh chnh l trnh bash)
Gi tr tr v:
-127: m li khng khi ng shell thc hin lnh
-1: m li khc
<> -1: m tr v khi thc hin lnh string
V d:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
if(!system("ls -l /"))
printf("Call system() OK!\n");
return 0;
}
2.66
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

c
c
h
h

m
m
exec
exec

()
()
Cc hm exec() thc hin nh sau:
2.67
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

c
c
h
h

m
m
exec
exec

()
()
Ch
Cc hm exec s thay th process gi hm bng chng trnh
tng ng trong tham s nhp ca hm. Vng text, data, stack b
thay th, vng u (user area) khng b thay th.
Chng trnh c gi bt u thc thi hm main() (entry point),
c th nhn tham s nhp thng qua cc tham s truyn vo cc
hm exec.
Gi thc thi lnh du nhc
$ ls -R /usr /lib
Chng trnh dng exec()
...
execl(
2.68
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

c
c
h
h

m
m
exec
exec

()
()
Phn tch tn gi cc hm exec()
int execl (const char *path, const char *arg, ...)
int execv (const char *path, const char *argv[ ])
Hm c cha k t v (execv, execvp, execve) accept the argument
list for the new program as a NULL-terminated array of pointers to
strings. Functions that contain the letter l (execl, execlp, and execle)
accept the argument list using the C languages varargs mechanism.
2.69
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

c
c
h
h

m
m
exec
exec

()
()
Phn tch tn gi cc hm exec()
Hm c cha k t v (execv, execvp, execve) accept the argument
list for the new program as a NULL-terminated array of pointers to
strings. Functions that contain the letter l (execl, execlp, and execle)
accept the argument list using the C languages varargs mechanism.
Functions that contain the letter p in their names (execvp and
execlp) accept a program name and search for a program by that
name in the current execution path; functions that dont contain the
p must be given the full path of the program to be executed.
Functions that contain the letter e in their names (execve and
execle) accept an additional argument, an array of environment
variables.The argument should be a NULL-terminated array of
pointers to character strings. Each character string should be of the
form VARIABLE=value
2.70
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
C
C

c
c
h
h

m
m
exec
exec

()
()
Phn tch tn gi cc hm exec()
Hm c cha k t v (execv, execvp, execve) accept the argument
list for the new program as a NULL-terminated array of pointers to
strings. Functions that contain the letter l (execl, execlp, and execle)
accept the argument list using the C languages varargs mechanism.
Functions that contain the letter p in their names (execvp and
execlp) accept a program name and search for a program by that
name in the current execution path; functions that dont contain the
p must be given the full path of the program to be executed.
Functions that contain the letter e in their names (execve and
execle) accept an additional argument, an array of environment
variables.The argument should be a NULL-terminated array of
pointers to character strings. Each character string should be of the
form VARIABLE=value
2.71
Khoa Cng ngh Khoa Cng ngh Thng tin Thng 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
v
v

c
c

c
c
h
h

m
m
exec
exec

()
()
Library Call
Name
Argument
Format
Pass Current Set of
Environment
Variables?
Search of
PATH
Automatic?
execl(...) list yes no
execv(...) array yes no
execle(...) list no no
execve(...) array no no
execlp(...) list yes yes
execvp(...) array yes yes
2.72
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

V d execlp()
#include <stdio.h>
#include <unistd.h>
void main() {
execlp("/sbin/ifconfig","/sbin/ifconfig","-a",0);
}
Dch v chy:
$gcc ex1.c o ex1
$./ex1
eth0 Link encap:Ethernet HWaddr 00:60:8C:84:E6:0E
......
2.73
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

V d execv()
#include <stdio.h>
#include <unistd.h>
void main(int argc, char *argv[]) {
execv("/sbin/ifconfig",argv);
}
Dch v chy:
$gcc ex2.c o ex2
$./ex2 -a
eth0 Link encap:Ethernet HWaddr 00:60:8C:84:E6:0E

2.74
Khoa Cng ngh Khoa Cng ngh Thng tin Thng tin - - i h i h c B c B ch Khoa Tp. HCM ch Khoa Tp. HCM
V
V

d
d

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
extern char **environ;
int main(int argc, char **argv) {
int pid, status;
char *child_argv[4];
if (argc == 1)
return 1;
pid = fork();
if (pid == -1)
return -1;
if (pid == 0) {
child_argv[0] = "sh";
child_argv[1] = "-c";
child_argv[2] = argv[1];
child_argv[3] = 0;
execve("/bin/sh", child_argv, environ);
exit(127);
}
do {
if (waitpid(pid, &status, 0) == -1) {
if (errno != EINTR)
return -1;
} else
return status;
} while(1);
return 0;
}

Anda mungkin juga menyukai