You are on page 1of 74

Thc hnh UNIX/Linux

- phn 2 -

Ni 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()

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.2

Qu trnh to process

gas/gcc/g++

.c, .cpp, .cc

gcc/g++

.o

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.3

B cng c pht trin ng dng 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.4

Trnh bin dch 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.5

GNU C/C++ compiler (gcc/g++)


source codes

.c,.cc e.g. hello.c


.c,.cc
gcc -E hello.c -o hello.cpp

preprocessed
source files

hello.cpp

.cpp

gcc -S hello.c [-o hello.s]

gcc -x cpp-output -S hello.cpp [-o hello.s]


assembly
source code

.s
gcc -x assembler -c hello.s [-o hello.o]

object
code

hello.o

gcc -c hello.c [-o hello.o]

b.o

a.o

gcc a.o b.o hello.o [-o hello]


executable
binary

gcc hello.c [-o hello]

a.out/hello
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.6

Tm tt mt s ty chn ca 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)
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.7

Bin dch chng trnh 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;
}

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.8

Bin dch chng trnh C/C++ (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;
}

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.9

Bin dch chng trnh C/C++ (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
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.10

Bin dch chng trnh C/C++ (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
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.11

Bin dch chng trnh C/C++ (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.

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.12

Th vin lp trnh trong Linux


Libraries
Libraries

statically
linking

dynamically
linking

Libraries
Libraries

Cho bit u v khuyt im ca statically vs. dynamically linking?


Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.13

Th vin lp trnh trong Linux

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.14

Cc loi th vin lp trnh


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

b.c

int func1(){

double func2(){

return 7;

return 3.14159;

}
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.15

Cc loi th vin lp trnh (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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.16

Cc loi th vin lp trnh (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
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.17

Cc loi th vin lp trnh


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
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.18

Cc loi th vin lp trnh (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???
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.19

Cc loi th vin lp trnh (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
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.20

Cc loi th vin lp trnh (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
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.21

C bn v 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.22

Theo di cc 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.23

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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.24

Kt thc thc thi foreground process


Dng t hp phm Ctrl-C
V d:
$find / -name *.ps -print
...
...
^C

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.25

Tm hon thc thi 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.26

Tm hon thc thi foreground


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

$ fg 1

find / ".profile" print

hoc

$ bg 1

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.27

Thc thi process 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)

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.28

Thc thi 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.

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.29

Qun l 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)

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.30

Chuyn foreground thnh background


process
Tr hon qu trnh (bng Ctrl + Z)
2. Dng lnh bg (background) chuyn process sang
ch thc thi background.
V d:
1.

$ls R / > kq
...
^Z
[1]+

$bg

Stopped

ls R / >kq

(v ch c mt jobs nn bg khng cn tham s)

[1]+ ls R / > kq &

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.31

Chuyn background thnh foreground


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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.32

Kt thc qu trnh
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
kill

-9

or

process_identifier

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.33

Lp trnh 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()

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.34

S lc v *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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.35

Mt s nhnh pht trin


BSD UNIX: California Univ. of Berkeley
System V: AT&T
SunOS/Solaris: Sun Microsystem
AIX: IBM Corp.
HP-UX: Hewlett-Packard
Linux: Linus Torvalds

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.36

Kin trc tng quan

ng dng
Giao din lp
trnh
Nhn (kernel)
Phn cng

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.37

Kin trc lun 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.38

*NIX Kernel
User level

System Call Interface

File System

IPC
Process
Control
System

Device
Driver

Scheduler
Memory
Management

Hardware Control
Hardware

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.39

Kernel vs. user space

Kernel Space
kswapd (5)

root (0)

User Space

init (1)

sh

sh
sh

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.40

Qun l cc qu trnh
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,.

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.41

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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.42

B nh ca 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.

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.43

Cu trc b nh
Process memory layout:
Text segment (code)
Data segment

High address

argc/argv[]
Stack segment

Stack
Heap
Command-line
arguments
Environment variables

Heap

end
edata

Uninitialized data
Initialized data

etext
Low address

Text segment

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.44

Cu trc b nh

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.45

a ch b 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);

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.46

V 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;
}
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.47

Ly i s v bin mi trng
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
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.48

Ly i s v bin mi trng (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

Chng trnh myapp.c

$ ./myapp 12 34 56 78

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


... }

argc

argv

55

"./myapp"
"34"
"78"

"12"
"56"

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.49

V 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;
}
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.50

Ly PID ca process
#including

<unistd.h>

pid_t getpid(void);

Ly PID ca process hin hnh


pid_t getppid(void);

Ly PID ca process cha

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.51

V d
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Process id: %d\n", getpid());
printf("Parent process id: %d\n", getppid());
return 0;
}

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.52

To 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

fork()
Child

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.53

Chu k sng ca process

wait()

Parent
Process

Parent
Process

fork()

Zombie
Process

Child
Process

Child
Process
exec

exit

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.54

To 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.55

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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.56

To process
Parent process

Text
Data

fork()

Stack

Child process

Text
Data
Stack

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.57

V 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;
}
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.58

Kt thc 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.

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.59

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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.60

Kt thc 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()

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.61

V 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;
}
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.62

V d (tip 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;
}
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.63

Cc hm gi thc thi chng trnh


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)

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.64

int system(const 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;
}
Khoa Cng ngh
ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.65

Cc hm exec()
Cc hm exec() thc hin nh sau:

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.66

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

Chng trnh dng exec()

$ ls -R /usr /lib

...
execl(

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.67

Cc hm 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.

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.68

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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.69

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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.70

Tm tt v cc hm exec()
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

Library Call
Name

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.71

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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.72

V 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

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.73

V d
#include <stdio.h>

child_argv[2] = argv[1];

#include <stdlib.h>

child_argv[3] = 0;

#include <errno.h>

execve("/bin/sh", child_argv, environ);

extern char **environ;

exit(127);

int main(int argc, char **argv) {


int pid, status;
char *child_argv[4];

}
do {
if (waitpid(pid, &status, 0) == -1) {

if (argc == 1)

if (errno != EINTR)

return 1;

return -1;

pid = fork();

} else

if (pid == -1)

return status;

return -1;

} while(1);

if (pid == 0) {

return 0;

child_argv[0] = "sh";
child_argv[1] = "-c";

Khoa Cng ngh


ngh Thng tin -
i h
hc B
Bch Khoa Tp. HCM
2.74

You might also like