You are on page 1of 57

Mn hc: L p trnh h thng

Bo Co LP TRNH H THNG
Ti:

H iu hnh Linux

GVGD: Phm Vn Khoa SVTH: inh Vn Mnh Lng Vng Giang Trn Minh Thanh ng Quang Thnh 09119059 09119010 09119034 09119039

Phn: H i u hnh Linux

Trang 1

Mn hc: L p trnh h thng

Mc lc PHN I. LP TRNH SHELL .......................................................................................... 4 I. Bash shell ................................................................................................................ 4 1. S dng bin ........................................................................................................ 4 2. Cu trc iu khin ........................................................................................... 10 3. Danh sch AND (&&) ......................................................................................... 16 4. Danh sch Or ....................................................................................................... 18 5. Ti liu here ......................................................................................................... 18 II. Ngn ng C shell ..................................................................................................... 19 1. Bin ..................................................................................................................... 19 2. Cu trc iu kin If .......................................................................................... 20 3. Cu lnh while: .................................................................................................. 20 4. Nhiu iu kin - AND/OR ................................................................................ 21 5. Cu lnh foreach:............................................................................................... 21 6. Cu lnh while: .................................................................................................. 22 7. 8. Switch case ................................................................................................... 22 Tham s dng lnh: .......................................................................................... 23

III. Trnh by s khc nhau trong cu trc iu khin gia 2 loi shell ny ............ 23 1. Mnh If .......................................................................................................... 23 2. Dng If else .................................................................................................... 24 3. Dng else - if ....................................................................................................... 24 4. Mnh case ...................................................................................................... 25 5. Mnh for ........................................................................................................ 26 6. Mnh while .................................................................................................... 26 7. Mnh Until .................................................................................................... 27 PHN II. LP TRNH C TRN LINUX ....................................................................... 34 A. Th vin lin kt trn Linux ................................................................................ 34 a. Th vin lin kt tnh......................................................................................... 34 b. Th vin lin kt ng ....................................................................................... 42 B. Makefile: s dng trong bin dch m ngun. .................................................... 50 1. V sao ta phi dng Makefile? ........................................................................... 50
Phn: H i u hnh Linux Trang 2

Mn hc: L p trnh h thng

2.

........................................................ 53

3. V d Demo s dng Makefile ........................................................................... 55

Phn: H i u hnh Linux

Trang 3

Mn hc: L p trnh h thng

PHN I. LP TRNH SHELL


Cc shell trn unix/linux
Sh ( Bourne) : shell nguyn thy p dng cho Unix Csh, Tcsh, zsh : Dng shell s dng cu trc lnh ca C lm ngn ng kch bn. c to ra u tin bi Bia Joy. L Shell thng dng th hai sau Bash Shell. - Bash : shell ch yu ca Linux. Ra i t d n GNU.bash (vit tt ca Bourne Again Shell ) c li im l m ngun c cng b rng ri. Cc bn c th ti v v s dng min ph ti www.gnu.org - Rc : Shell m rng ca csh vi nhiu tng thch vi ngn ng C hn. Rc cng ra i t d n GNU Ch : Tuy bash l shell l shell chun c cc nh phn phi s dng ph bin trong Linux nhng cc v d v lp trnh s s dng ngn ng v lnh ca shell sh bi v shl shell nguyn thy, c th chy trn c Unix. Bng lnh file ta s thy trong hu ht cc bn Linux hin nay sh ch l lin kt dn n bash m thi. V d : $file / bin / sh /bin/sh : symbolic link to bash iu ny c ngha l bash hon ton c th din dch v iu khin cc lnh ca shell sh.

I. Bash shell
phn ny ta s tm hiu v : - Bin: kiu chui, kiu s, tham s v bin mi trng. - iu kin : kim tra lun l Boolean bng shell - iu kin chng trnh: if, elif, for, while, until, case 1. S dng bin Thng th ta khng cn phi khai bo bin trc khi s dng. Thay vo bin s t ng to v khai bo khi ln u tin tn bin xut hin, chng hn nh trong php gn. Mc nh tt c cc bin u c khi to v mang tr kiu string.Tng t nh HH v ngn ng C, c php Shell phn bit ch hoa ch thng, bin mang tn foo, Foo, FOO l 3 bin khc nhau. Bn trong Script ca Shell, bn c th ly v ni dung ca bin bng cch dng du $ t trc tn bin. hin th ni dung ca bin, bn c th dng
Trang 4

Phn: H i u hnh Linux

Mn hc: L p trnh h thng

lnh echo. Khi gn ni dung cho bin bn khng cn s dng k t $ . V d trn dng lnh, bn c th gn ni dung v hin th bin nh sau : $ xinchao = hello $echo $xinchao Hello $ xinchao = I am here $echo $xinchao I am here $ xinchao =12+1 $echo $xinchao 12+1 Lu : sau du = khng c c khong trng. Nu gn ni dung chui c khong trng cho bin, cn bao bc chui bng du . 1.1 Cc k t c bit ngha 1.1.1 Cc k t chuyn hng vo/ ra K hiu > >> < << 2> 2>> u ra hng ti Ni vo ni dung ca Ly u vo t < u vo l y u ra bo li s hng vo u ra bo li hng v ghi thm vo

1.1.2 Cc k t kim sot tin trnh Du & ( ampersand) : t mt tin trnh vo ch chy nn. Vi & chng trnh s t chy v shell quay ngay v tng tc vi ngi dng, tr li du nhc ngay. Tin trnh nn c nhiu cch kim sot. Du ( ; ) Dng nhm mt s lnh li, phn cch bi ; Du ` ` (backqoutes) Du thay th.

Bt k lnh no xut hin trong du nhy s c thc hin trc v kt qu ca lnh s thay th u ra chun (stdout) trc khi lnh trong dng lnh thc hin Pipeline
Trang 5 Phn: H i u hnh Linux

Mn hc: L p trnh h thng

Shell cho php kt qu thc thi mt lnh, kt hp trc tip u vo ca lnh khc m khng cn x l trung gian t lnh cmd chy nn Thc hin cmd trong mt shell con u ra cmd s thay cho u ra ca lnh trong dng lnh Du hay

cmd &

cmd1 ; cmd2 Chy cmd1 trc sau chy cmd2 (cmd) `cmd`

Cmd1\cmd2 Ni u ra ca cmd1 vo u vo ca cmd2 V d du hoc #!/bin/bash myvar="Hi there" echo $myvar echo "message : $myvar" echo 'message : $myvar' echo "message :\$myvar" echo Enter some text read myvar echo '$myvar' now equals $myvar exit 0 Kt xut khi thc thi script : Hi there Message : Hi there Message: $myvar Message: $myvar Enter some text Hello world $myvar now equals Hello World

Phn: H i u hnh Linux

Trang 6

Mn hc: L p trnh h thng

Cch chng trnh lm vic: Bin myvar c to ra v khi gn gi tr


chui Hi there. Ni dung ca bin sau c hin th bng lnh echo trong cc trng hp bc chui bng du nhy kp, nhy n v du hin th c bit . Tm li nu mun thay th ni dung bin trong mt chui cn bc chui bng nhy kp. Nu mun hin th ton b ni dung ca chui,hy dng nhy n. 1.2 Bin mi trng Khi trnh shell khi ng n cung cp sn mt s bin c khai bo v gn gi tr mc nh. Chng c gi l cc bin mi trng. Cc bin ny thng c vit hoa phn bit vi cc bin do ngi dng t nh ngha ( thng l k t khng hoa ). Ni dung cc bin ny thng ty vo thit lp ca h thng s dng. Danh shell ca cc bin mi trng l kh nhiu, nhng nhn chung nn nh mt s bin mi trng ch yu sau: ngha Cha ni dung ca th mc ch Cha danh shell cc ng dn Du nhc hin th trn dng lnh. Thng l $user Du nhc th cp, thng bo ngi dng nhp thm thng tin trc khi lnh $IFS $0 $# $$ thc hin. Thng l du > Du phn cch cc trng hp trong danh shell chui Cha tn chng trnh gi trn dng lnh S tham s truyn trn dng lnh M tin trnh ca shell script thc thi Bin mi trng $HOME $PATH $PS1 $SP2

Mi mi trng m user ng nhp cha mt s danh shell bin mi trng dng cho mc ch ring. C th dng lnh export ca shell . 1.3 Bin tham s (parameter variable) Nu cn tip nhn tham s trn dng lnh x l, c th dng thm cc bin mi trng sau: Bin tham s $1,$2,$3 ngha V tr v ni dung ca cc tham s trn dng lnh theo th t tri phi
Phn: H i u hnh Linux Trang 7

Mn hc: L p trnh h thng

S*

Danh shell ca tt c cc tham s trn dng lnh. Chng c lu trong mt chui duy nht phn cch bng k t u tin quy nh trong bin $IFS Danh shell cc tham s c chuyn thnh chui. Khng s dng du phn cch ca bin IFS

S@

V d sau s minh ha mt s cch n gin x l v truy xut bin mi trng . V d: Try_var.sh #!/bin/bash salutation="Hello" echo $salutation echo "The program $0 is now running" echo "The second parameter was $2" echo "The first parameter was $1" echo "The parameter list was $*" echo "The user's home directory is $HOME" echo "Please enter a new greeting" read salutation echo $salutation echo "The script is now complete" exit 0 Lu tn tp l try_var.sh, i thuc tnh thc thi x cho tp tin bng lnh : $chmod+x try_var.sh Khi chy try_varsh t dng lnh,bn s nhn c kt qu ca kt xut nh sau : $./try_var.sh foo bar baz Hello The program./try_var.sh is now running The second parameter was bar
Phn: H i u hnh Linux Trang 8

Mn hc: L p trnh h thng

The first parameter was foo The parameter list was foo bar baz The users home directory is/home/xyz Please enter a new greeting Xin chao! Xin chao! The script is now complete V d du hoc #!/bin/bash myvar="Hi there" echo $myvar echo "message : $myvar" echo 'message : $myvar' echo "message :\$myvar" echo Enter some text read myvar echo '$myvar' now equals $myvar exit 0 Kt xut khi thc thi script : Hi there Message : Hi there Message: $myvar Message: $myvar Enter some text Hello world $myvar now equals Hello World Cch chng trnh lm vic: Bin myvar c to ra v khi gn gi tr chui Hi there. Ni dung ca bin sau c hin th bng lnh echo trong
Phn: H i u hnh Linux Trang 9

Mn hc: L p trnh h thng

cc trng hp bc chui bng du nhy kp, nhy n v du hin th c bit \. Tm li nu mun thay th ni dung bin trong mt chui cn bc chui bng nhy kp. Nu mun hin th ton b ni dung ca chui,hy dng nhy n. 2. Cu trc iu khin 2.1. Lnh if Lnh If tuy n gin nhng c s dng nhiu nht . If kim tra iu kin ng hoc sai thc thi biu thc thch hp. If condition Then Statements Else Statements V d : on script sau s dng if ty vo cu tr li ca bn m a ra li cho thch hp : if_control.sh #!/bin/bash Echo Is it morning? Please answer yes or no Read timeofday If [$timeofday = yes ]; then Echo Good morning Else Echo Good afternoon Fi Exit 0 Kt qu ca scrift $./If_control.sh Is it morning? Please answer yes or no Yes Good morning $ 2.2. Lnh Elif
Trang 10

Phn: H i u hnh Linux

Mn hc: L p trnh h thng

Trong v d If_control.sh trn c rt nhiu pht sinh. Tt c cc cu tr li khc vi yes u c ngha l no. Chng ta c th khc phc iu ny bng cch s dng cu trc iu khin elif. Mnh ny cho php kim tra iu kin ln th 2 bn trong else. Script di y c th hon chnh hn, c th in ra thng bo li nu ngi dng nhp khng ng yes hoc no V d: Elif_control.sh #!/bin/bash Echo Is it morning? Please answer yes or no Read timeofday If [$timeofday = yes]; then Echogood morning Elif[$timeofday= no]; then Echo Good afternoon Else Echo Sorry, $timeofday not recognized. Enter yes or no Fi Exit 0 Ch : Tng t nh v d if_control.sh nhng ta s dng them elif kim tra trng hp ngi dng khng nhp no. Thng bo li c in ra v m li tr v bng lnh exit l 1. Trng hp hoc yes hoc no c nhp vo, m li tr v s l 0. Lnh For S dng for lp li mt s ln vi cc gi tr xc nh. Phm vi lp c th nm trong mt tp hp chui ch nh tng minh bi chng trnh hay l kt qu tr v t mt bin hoc biu thc khc. C php: For variable in values Do Statements

2.3. -

Phn: H i u hnh Linux

Trang 11

Mn hc: L p trnh h thng

Done V d: for.sh #!/bin/bash rm -rf fred* echo > fred1 echo > fred2 mkdir fred3 echo > fred4 for file in fred* do if [ -d "$file" ]; then break; fi done echo first directory fred was $file exit 0 2.4. Lnh Case Lnh Case c cch s dng hi phc tp hn cc lnh hc. C php ca lnh case nh sau : Case variable in Pattern[ | partten].) statement ; ; Pattern[ | partten].) statement ; ; . Esac Mc d nhn kh kh hiu , nhng lnh case rt linh ng. Case cho php thc hin so khp ni dung ca bin vi mt chui mu pattern no . Khi mt mu c so khp th lnh statement tng ng s c thc hin. Hy lu t du ;; pha sau mi mnh so khp pattern, shell dng du hiu ny nhn dng mu pattern so khp tip theo m bin cn thc hin.

Phn: H i u hnh Linux

Trang 12

Mn hc: L p trnh h thng

Vic cho php so khp nhiu mu khc nhau lm case tr nn thch hp cho vic kim tra nhp liu ca ngi dng. Sau y l v d : case1.sh #!/bin/bash echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in "yes") echo "Good Morning";; "no" ) echo "Good Afternoon";; "y" ) echo "Good Morning";; "n" ) echo "Good Afternoon";; * ) echo "Sorry, answer not recognised";; esac exit 0 Cch thc hin: Sauk hi ngi dng nhp vo cu tr li, lnh case s ly ni dung ca bin $timeofday so snh vi tng chui. Khi gp chui thch hp n s thc thi lnh sau du ) v kt thc (khng tip tc so khp vi cc mu khc) . K t i din * cho php so khp vi mi loi chui. * thng c xem nh trng hp so snh ng cui cng nu cc mu so snh trc tht bi. Bn c th xem * l mnh default trong lnh switch ca C hay case.else ca Pascal. Ngoi cch trn, ta c th kt hp chung cc mu so khp vi nhau khin cho case ngn gn hn nh sau: case2.sh #!/bin/bash echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning";; "n*" | "N*" ) *) esac echo "Good Afternoon";; echo "Sorry, answer not recognised";;

Phn: H i u hnh Linux

Trang 13

Mn hc: L p trnh h thng

exit 0 Script trn s dng nhiu mu so khp trn mt dng so snh ca lnh case . Cc mu ny c ngha tng t nhau v yu cu thc thi cng mt lnh nu iu kin ng xy ra. Cch vit ny thc t thng dng v d c hn cch vit th nht. Mc d vy. hy tm hiu case v d sau, case s dng lnh exit tr v m li cho tng trng hp so snh mu ng thi case s dng cch so snh tt bng k t i din. V d: Case3.sh #!/bin/bash echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning" echo "Up bright and early this morning?" ;; "[nN]*" ) echo "Good Afternoon" ;; *) echo "Sorry, answer not recognised" echo "Please answer yes or no" exit 1 ;; esac exit 0 Cch thc hin : Trong trng hp no ta dng k t i din * thay th cho tt c k t n v N. iu ny c ngha l nx hay Nuu c ngha l no. v d trn ta thy cch t nhiu lnh trong cng mt trng hp so khp . Exit 1 cho bit ngi dng khng chn yes v no. Exit 0 bit ngi dng chn yes , no theo yu cu: C th khng cn t ;; mu so khp cui cng trong
Phn: H i u hnh Linux Trang 14

Mn hc: L p trnh h thng

lnh case (pha trc esac) , v khng cn mu so khp no cn thc hin na. Khng nh C yu cu phi t lnh break mi mnh case, shell khng i hi iu ny, n bit t ng chm dt khi lnh case tng ng tm c mu tha mn. lm case tr nn mnh m v so snh c nhiu trng hp hn, c th gii hn cc k t so snh theo cch sau : [yy] | [Yy] [Ee] [Ss] , khi y, Y hay yes, YESu c xem l yes. Cch ny ng hn l dng k t thay th ton b * trong trng hp [nN]*. 2.5 Lnh while Lnh while cho php thc hin lp v hn khi iu kin kim tra vn cn ng C php: While condition do Statements Done V d : password.sh #!/bin/sh Echo enter password Read trythis While [$trythis !- secret]; do Echo sorry, try again Ready Done Exit 0 Kt xut ca script $./password.sh Enter password Abc Sorry, try again Secret $
Phn: H i u hnh Linux Trang 15

trythis

Mn hc: L p trnh h thng

Lnh while lin tc kim tra ni dung bin $trythis , yu cu nhp li d liu bng lnh read mt khi $trythis vn cha bng vi chui secret. 2.6. Lnh until C php lnh: Until condition Do Statements Done Lnh until tng t lnh while nhng iu kin kim tra b o ngc li. Vng lp s b dng nu iu kin kim tra l ng. V d sau s dng lnh until ch user ng nhp V d until_user.sh #!/bin/sh Echo Locate for user Until who | grep $1 > dev/null Do Sleep 60 Done Echo e\\a Echo ***** $1 has just logged in ****** Exit 0 Lnh who c danh shell cc user ng nhp vo h thng, chuyn danh shell ny cho grep bng c ch ng ng ( | ) . Lnh grep lc ra tn user theo bin mi trng $1 hin c ni dung l chui xyz. Mt khi lnh grep lc ra d liu , n s truyn ra vng tp tin rng/dev/null v tr li gi tr null, lnh until kt thc. 3. Danh sch AND (&&)

Phn: H i u hnh Linux

Trang 16

Mn hc: L p trnh h thng

Danh shell AND cho php thc thi mt chui cnh k nhau, lnh sau ch thc hin khi lnh trc thc thi v tr v m li thnh cng. C php s dng nh sau : Statement1 && statement2 && statement3 &&. Bt u t bn tri statement1 s thc hin trc, nu tr v true th statement2 tip tc c gi. Nu statement2 tr v false th shell chm dt danh shell AND v ngc li statement3 s c gi .Ton t && dng kim tra kt qu tr v ca statement trc . Kt qu tr v ca AND s l true nu tt c cc lnh statement u c gi thc thi. Ngc li l false. V d sau dng lnh toauch file_one ( kim tra file_one tn ti hay cha, nu cha th to mi) tip n rm file_two. Sau cng danh shell AND s kim tra xem cc file c ng thi tn ti hay khng a ra thng bo thch hp. V d and.sh #!/bin/bash touch file_one rm -f file_two if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo "there" then echo -e "in if" else echo -e "in else" fi exit 0

Chy th script trn bn s nhn c kt qu nh sau : $./and_list.sh Hello In else Cch chng trnh lm vic : Lnh touch v rm m bo rng file_one tn ti v file_two khng c. Trong danh shell biu thc if, && s gi lnh [-f file_one ] trc. Lnh ny thnh cng v touch to sn file_one. Lnh echo tip tc c gi lun tr v tr true nn theo lnh tip theo [-f file_two] thi hnh. Do file_two khng tn ti nn echo there khng c gi. Ton b
Phn: H i u hnh Linux Trang 17

Mn hc: L p trnh h thng

biu thc tr v gi tr false (v cc lnh trong danh shell khng c thc thi ht). Do if nhn tr false nn echo trong mnh else ca lnh if c gi. 4. Danh sch Or Danh sch OR cng tng t vi AND l thc thi mt dy cc lnh tr v true th vic thc thi dng li. C php nh sau : Statement1||statement2||statement3 &&. V d: or_list.sh #!/bin/sh Rm f file_one If [ -f file_one] || echo hello || echo there Then Echo in if Else Echo in else Fi Exit 0 Cch chng trnh lm vic: File_one u tin c loi b m

bo lnh if tip theo khng tm thy n. Lnh [-f file_one ] tr v false v file_one khng tn ti. Lnh echo tip theo trong chui danh shell OR s c gi in ra hello. Do echo lun tr v true nn echo tip theo khng c gi. Bi v trong danh shell OR c mt lnh tr v true nn ton b biu thc s l true. Kt qu cui cng l echo trong if c gi in ra chui in if. 5. Ti liu here - Unix v Linux cung cp c ch t ng ha m phng vic nhp h vo t bn phm bng ti liu here ( here document). Ta sn cc phm hay chui cn g trong mt tp tin v chuyn hng tp tin ny cho lnh cn thc thi. N s tip nhn v c ni dung tp tin nh nhng g g t bn phm. V d, khi g lnh cat , n s ch nhp d liu g vo t bn phm. Nu khi script thc thi khng c mt ngi dng th sao? Qu trnh t ng ca

Phn: H i u hnh Linux

Trang 18

Mn hc: L p trnh h thng

script s dng li ch n khi ta xut hin g d liu vo. C ch ti liu here gip thc hin t ng nhp liu nh sau : v d cat_here #! /bin/bash cat > test.txt <<!YOURLABEL! Hello This is here document !YOURLABEL! Kt qu khi thc thi cat_here.sh, tp test.txt c to ra. Vi ni dung l chui Hello This ista khng cn phi dng tay nhp d liu cho lnh cat. Ti liu here yu cu t c php gia nhn bt u v nhn kt thc. Trong v d trn nhn bt u l !YOURLABEL! ( Lu n k t << u dng cho bit ni bt u ca ti liu here) ,nhn kt thc l !YOURLABEL! . Du ! hai bn nhn YOURLABEL ch d dng nhn ra nhn m thi, trong trng hp ni dung d liu ca chui YOURLABEL th cp ! ! cng dng phn bit ring tn nhn ca ngi dng.

II. Ngn ng C shell


Cu trc C Shell: C Shell cung cp ngn ng dng lnh tng t nh ngn ng lp trnh C. Ngn ng C shell cha cu trc: nhp v xut, ton t iu kin, qun l tp tin v nh ngha bin...Nu bn lm quen vi cc ngn ng lp trnh cp thp, th lp trnh shell s rt n gin. 1. Bin Lnh c bn khai bo bin trong C shell l set. V d: set name = "Henri" => s khi to bin name cha gi tr "Henri". set users = (George Frank Mary Heloise Hartsell) => s khi to bin c kiu d liu wordlist (mng chui), by gi chng ta c th truy cp gi tr ny bng index ca chng. @ count = 0 => khi to bin kiu integer.
Phn: H i u hnh Linux Trang 19

Mn hc: L p trnh h thng

Ghi ch: lnh set ch c s dng cho cc bin shell. Bin mi trng nh DISPLAY, EDITOR...phi c khai bo bng lnh setenv. 2. Cu trc iu kin If a. If...then Cho php ngi dng thc thi mt lnh hoc mt nhm lnh ch khi iu kin ph hp. Cu trc nh sau: if (condition(s)) then command(s) endif iu kin trong du ngoc c tnh trc v tr v gi tr 0 (false) hoc 1 (true). Ch khi iu kin l true cc lnh mi c thc thi. b. If...then...else Cu trc ny cho php ngi dng xc nh nhm lnh "default" - thc thi nu iu kin sau t kha if l false, ngc li nhm lnh gia iu kin if v t kha else s thc thi. if (condition(s)) then command group 1 else command group 2 end if 3. Cu lnh while: C lc bn cn thc thi mt lnh lp i lp li cho n khi iu kin ph hp. Nu cu trc if...then khng p ng c, bi v iu kin ca n ch c tnh ton mt ln. t iu kin trong foreach cng khng p ng c hoc kh coi, bi v s vng lp v hn. Chng ta cn mt vng lp xoay vng khng hn nh cho n khi gi tr ca iu kin l false. Trong trng hp ny, chng ta s dng cu lnh while: while (condition) statements end

Phn: H i u hnh Linux

Trang 20

Mn hc: L p trnh h thng

4. Nhiu iu kin - AND/OR - Ton t AND l && - iu kin ghp l true nu c tt c iu kin l true. - Ton t OR l || v iu kin ghp s l true nu mt trong tt c iu kin l true. Ton t kim tra tp tin: operator filename V d: Chy lnh da vo iu kin tp tin "mail.log" c tn ti hay khng. if (-e mail.log) then cat new.log >> mail.log endif S dng bin thay th cho tn tp tin: set file_to_remove = .pine-interrupted-mail if (-z $file_to_remove) then rm $file_to_remove endif => kim tra file c tn cha trong bin c chiu di l 0 hay khng, nu ng l xa file i. Ton t -d -e -f -o -r -w -x -z ngha tp tin l th mc? tp tin tn ti? plain file? quyn ch s hu? quyn c? quyn ghi? quyn thc thi? tp tin c chiu di l 0?

o ngc gi tr ca ton t ny, s dng ! trc ton t trong du ngoc (v d nh ! -z filename). 5. Cu lnh foreach:
Phn: H i u hnh Linux Trang 21

Mn hc: L p trnh h thng

Cu lnh foreach cho php bn thc thi mt lnh hoc mt nhm lnh cho mi file m tn ca n ph hp vi mu xc nh. V d: to script xa file rng v file c tn l core trong th mc home ca bn. #!/bin/csh foreach dudfile(/home/users1/hansel/*) if (-z $dudfile || $dudfile == "core") then rm $dudfile endif end 6. Cu lnh while: C lc bn cn thc thi mt lnh lp i lp li cho n khi iu kin ph hp. Nu cu trc if...then khng p ng c, bi v iu kin ca n ch c tnh ton mt ln. t iu kin trong foreach cng khng p ng c hoc kh coi, bi v s vng lp v hn. Chng ta cn mt vng lp xoay vng khng hn nh cho n khi gi tr ca iu kin l false. Trong trng hp ny, chng ta s dng cu lnh while: while (condition) statements end 7. Switch case Chn la t danh sch: Gi s bn vit mt chng trnh menu. Ngi dng chn s t 1 n 6. Mt hnh ng s c thc hin ph thuc vo nhng g ngi dng chn. Chng ta c th s dng mt chui cu lnh if...then...else if...then...else if...then..., nhng rt kh coi v kh c nu chng ta debug chng trnh. Thay vo chng ta c th s dng chc nng switch...case. #!/bin/csh echo -n "Please enter your first name: " set uname = $< switch ($uname) case [Gg]eorge:
Phn: H i u hnh Linux Trang 22

Mn hc: L p trnh h thng

cat /messages/George breaksw case [Mm]ary: cat /messages/Mary breaksw case [Ss]andy: cat /messages/Sandy breaksw default: cat /messages/Goodbye exit 1 endsw 8. Tham s dng lnh: Nu bn mun script ca bn chy ging nh cc lnh UNIX khc - cho php ngi dng chuyn vo tn tp tin hoc chui, th bn s cn s dng kh nng tham s ca C shell. Trong C shell c bin c bit l argv. Bin ny c kiu d liu wordlist, mi t trn dng lnh l mt phn t trong mng. V d chng ta vit script wrap cho php thc hin mt s chc nng trn file, chng ta gi script vi cu trc: wrap infile outfile Trong script ny gi tr argv[1] s l infile v gi tr argv[2] s l outfile. Chng ta c th truy cp cc gi tr ny nh sau: #!/bin/csh if (!-e $argv[1]) then echo "Error: file $argv[1] does not exist." exit 2 endif

III. Trnh by s khc nhau trong cu trc iu khin gia 2 loi shell ny
Cu trc iu khin gm If, Elif , For, While, Until, Case

1. Mnh If
Phn: H i u hnh Linux Trang 23

Mn hc: L p trnh h thng

bash if [bieu_thuc] then cau_lenh ... fi if (bieu_thuc) then cau_lenh ... endif

csh

Nu biu thc bieu_thuc c nh gi l ng th (cc) cu lnh cau_lenh s c thc hin, cn khng th chng trnh s b qua v thc hin ngay cu lnh pha sau fi hoc endif. Nu ch c mt cu lnh c thc hin trong if th Csh cn c mt dng n gin hn l : if (bieu_thuc) cau_lenh

2. Dng If else
bash if [bieu_thuc] then cau_lenh ... else cau_lenh ... fi if (bieu_thuc) then cau_lenh ... else cau_lenh ... endif Csh

Dng ny m rng dng n gin ni trn ch: nu bieu_thuc l Sai th (cc) cu lnh cau_lenh sau else s c thc hin.

3. Dng else - if
Nu sau else cn tin hnh kim tra mt iu kin bieu_thuc2 na th ngi ta phi a thm mt mnh if na vo trong khi mnh else.

bash if [bieu_thuc] then cau_lenh ... elsif [bieu_thuc2] then cau_lenh ... else
Phn: H i u hnh Linux

Csh if (bieu_thuc) then cau_lenh ... else if (bieu_thuc2) then cau_lenh ... else caulenh ... endif
Trang 24

Mn hc: L p trnh h thng

cau_lenh ... fi
V d 1: V d sau s thc hin kim tra tp tai_lieu c nm trong th mc hin ti khng v in kt qu ra mn hnh. - i vi bash v pdksh: if [ -f tai_lieu] then echo "Co tp tai_lieu trong thu mc hien thoi" else echo "Khong tim thay tp tai_lieu trong thu muc hien thoi" fi - i vi csh (lu phi c k t # u chng trnh) : # if ( { -f tai_lieu } ) then echo "Co tp tai_lieu trong thu muc hien thoi" else echo "Khong tim thay tp tai_lieu trong thu muc hien thoi" endif

4. Mnh case
Mnh case cho php so mt mu (chui k t) vi nhiu mu khc nhau v thc hin on m tng ng vi mu trng khp. C php ca n nh sau:

bash case mau in mau1) cau_lenh ... ;; mau2) cau_lenh ... ;; ... *) cau_lenh ...
Phn: H i u hnh Linux

Cshell switch (mau) case mau1: cau_lenh ... Breaksw case mau2: cau_lenh ... breaksw ... default: cau_lenh ...
Trang 25

Mn hc: L p trnh h thng

;; esac

breaksw endsw

Trong , mau c so snh ln lt vi cc mu mau1, mau2... Nu c mt mu trng khp th (cc) cu lnh tng ng s c thc hin cho n khi gp hai du chm phy (;;) bash hoc breaksw (csh). Nu khng c mu no trng khp th (cc) cu lnh trong khi * bash hoc default (csh) c thc hin.

5. Mnh for
Mnh for thc hin cc cu lnh trong vng lp vi mt s ln nht nh. N c cc dng sau:

Bash for bien in danh_sach do cau_lenh ... done

Csh foreach bien (danh_sach) cau_lenh ... end

Trong dng ny, mnh for thc hin mi vng lp cho mi mc trong danh sch danh_sach. Danh sch ny c th l mt bin cha cc t ngn cch nhau bi mt du cch hoc cng c th c g trc tip cc t vo dng lnh. Mi vng lp, bin bien c gn ln lt mt mc (t) trong danh sch cho n ht danh sch.

6. Mnh while
Mnh while thc hin on chng trnh bn trong chng no m biu thc cho cn l ng. C php ca n nh sau:

bash while bieu_thuc do menh_de ... done while (bieu_thuc) menh_de ... end

Csh

Phn: H i u hnh Linux

Trang 26

Mn hc: L p trnh h thng

7. Mnh Until
C php ca mnh until ging vi mnh while. im khc bit l ch, mnh while thc hin vng lp chng no biu thc iu kin cn ng, cn mnh until thc hin vng lp chng no biu thc iu kin cn Sai. C php ca n trong bash nh sau : until bieu_thuc do cau_lenh ... done

Csh khng c mnh ny.

IV. BI TP SHELL Yu cu : Vit mt chng trnh shell tng tc vi h thng Linux vi yu cu:
chng trnh shell to mt menu la chn cho php 1. 2. 3. 4. 5. hin th tn cc nhm c trong h thng v cc user tn ti trong tng nhm hin th tn v mt khu ca tt c cc user tn ti trong h thng hin th thi gian ng nhp ca tng user vo h thng hin th cc thng tin v phn cng ca h thng kim tra xem cc phn mm: pico, vi, openssh server, gcc, tftp, nfs ci t trn

h thng hay cha? Nu phn mm no cha ci th s t ng ci t cho h thng

Thc hin: Di y l script thc hin yu cu trn.


#!/bin/bash until [ "$verify" = n ] do echo "La chn cc tnh nng theo s th t " echo "1) hin th tn cc nhm c trong h thng v cc user tn ti trong tng nhm " echo "2) hin th tn v mt khu ca tt c cc user tn ti trong h thng " echo "3) hin th thi gian ng nhp ca tng user vo h thng " echo "4) hin th cc thng tin v phn cng ca h thng "

Phn: H i u hnh Linux

Trang 27

Mn hc: L p trnh h thng

echo "5) kim tra xem cc phn mm: pico, vi, openssh server, gcc, tftp, nfs ci t trn h thng hay cha? Nu phn mm no cha ci th s t ng ci t cho h thng " echo "6) Quit" echo "Please enter your choice" read pattern case $pattern in 1) echo "Hin th la chn 1" echo "Danh sch tn nhm v cc user" cat /etc/passwd | cut -d: -f1,5 # hien thi ten nhom va user trong tung nhom ;; 2) echo " Hin th la chn 2" echo "Tn v mt khu cc user" sudo cat /etc/shadow

# login - login name # password - password in encrypted form, which is 13 to 24 characters long. # Daysince - Days since [month, day, year] that the password was changed # Daysafter - Days before the password may be changed # Daysmust - Days after which the password must be changed # dayswarn - Days before the password will expire ( A warning to the user) # daysexpire - Days after the password expires that the account is disabled # daysince - Days since [month, day, year]that the account is disabled. # reserved - Reserved field. ;; 3) echo " Hin th la chn 3" echo "Thi gian ng nhp vo h thng ca tng user" last ;; 4) echo " Hin th la chn 4"
Trang 28

Phn: H i u hnh Linux

Mn hc: L p trnh h thng

echo "Thng tin phn cng" sudo lshw -short ;; 5) echo "Hin th la chn 5 " echo "Kim tra ci t phn mm" sudo dpkg -l 'pico' sudo dpkg -l 'vim-common' sudo dpkg -l 'openssh-server' sudo dpkg -l 'gcc' sudo dpkg -l 'tftp' sudo dpkg -l 'nfs-common' sudo dpkg -l 'nfs-client'

echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" echo "Ci t pico" sudo apt-get install pico

echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" echo "Ci t vi" sudo apt-get install vim-common

echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" echo "Ci t ssh-server" sudo apt-get install openssh-server

echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" echo "Ci t gcc" sudo apt-get install gcc

echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" echo "Ci t tftp"


Phn: H i u hnh Linux Trang 29

Mn hc: L p trnh h thng

sudo apt-get install tftp

echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" echo "Ci t nfs-common" sudo apt-get install nfs-common

echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" echo "Ci t nfs-client" sudo apt-get install nfs-client ;;

6) exit 0 ;; esac; echo "Do you want to continue your choice (y/n)?" read verify done

Kt qu : Menu hin th cc la chn

La chn 1: Hin th cc nhm v user trong tng nhm

Phn: H i u hnh Linux

Trang 30

Mn hc: L p trnh h thng

La chn 2: Hin th tn v mt khu tng user

Mt khu c m ha. La chn 3: Hin th thi gian ng nhp tng user

Phn: H i u hnh Linux

Trang 31

Mn hc: L p trnh h thng

La chn 4: Hin th thng tin phn cng

La chn 5: Kim tra cc gi phn mm v ci t - Di y l kim tra cc gi phn mm ci t hay cha

Phn: H i u hnh Linux

Trang 32

Mn hc: L p trnh h thng

- Nu cha c ci t th h thng s t ng ci t

Phn: H i u hnh Linux

Trang 33

Mn hc: L p trnh h thng

- H thng s hi bn c mun ci t tip phn mm khng.

PHN II. LP TRNH C TRN LINUX


A. Th vin lin kt trn Linux Hnh thc n gin nht ca th vin l tp hp cc tp tin .o do trnh bin dch to ra bc bin dch vi ty chn -c. a. Th vin lin kt tnh i. Khi nim th vin lin kt tnh Th vin lin kt tnh l cc th vin khi lin kt trnh bin dch s ly ton b m thc thi ca cc hm trong th vin a vo chng trnh chnh. ii. To th vin lin kt tnh Gm 3 bc c bn: Bc 1. Vit cc hm cho th vin. Bc 2. To cc file i tng t cc hm th vin va vit.

Phn: H i u hnh Linux

Trang 34

Mn hc: L p trnh h thng

Bc 3. Nn cc file i tng va to thnh mt file th vin .a, tip u ng lib. V d: To mt th vin lin kt tnh, cha cc hm vi chc nng nh sau: nhap3so: cho nhp vo 3 s thc. gptb2: gii phng trnh ax^2+bx+c=0, (a # 0) nhapchuoi: cho nhp vo chui k t. xulychuoi: nh dng c bn chui k t.

Bc 1. Vit cc hm cho th vin gedit nhap3so.c //code nhap3so.c #include<stdio.h> void nhap3so() { float a,b,c; printf("Ham nhap 3 so thuc : \n"); printf("Nhap cac he so : \n"); printf("Nhap a:\n"); scanf("%f",&a); printf("Nhap b:\n"); scanf("%f",&b); printf("Nhap c:\n"); scanf("%f",&c); } //end code nhap3so.c

gedit gptb2.c //code gptb2.c #include<stdio.h> #include<math.h> void gptb2()


Phn: H i u hnh Linux Trang 35

Mn hc: L p trnh h thng

{ float a,b,c; float x,x1,x2; float delta=b*b-4*a*c; if(delta>0) { x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); printf("Phuong trinh co 2 nghiem phan biet:\n"); printf("x1=%.2f , x2=%.2f ",x1,x2); } else if(delta==0) { x=-b/(2*a); printf("Phuong trinh co nghiem kep:\n"); printf("x1=x2=%.2f ",x); } else { printf("Phuong trinh vo nghiem !\n"); } }//end code gptb2.c

gedit nhapchuoi.c //code nhapchuoi.c #include <string.h> #include <stdio.h> char s[100]; void nhapchuoi() {
Phn: H i u hnh Linux Trang 36

Mn hc: L p trnh h thng

puts("Ham nhap chuoi ki tu : \n"); puts("Nhap vao mot chuoi ki tu: \n"); while(getchar() != '\n'); gets(s); } //end code nhapchuoi.c gedit xulychuoi.c //code xulychuoi.c #include<string.h> #include<ctype.h> #include<stdio.h> char s[100]; void xulychuoi() {

int len_s,i,j; len_s=strlen(s); printf("Do dai chuoi la %d\n",len_s); printf("\n"); //////////////////////////// for(i=0;i<len_s;i++) { if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32; } puts("Chuyen doi chuoi thanh chu thuong\n"); puts(s); printf("\n"); ///////////////////////////// for(j=0;j<len_s;j++)
Phn: H i u hnh Linux Trang 37

Mn hc: L p trnh h thng

{ if(j==0) s[0]=toupper(s[0]); if(s[j]==32) s[j+1]=toupper(s[j+1]); } puts("Viet hoa ki tu dau trong chuoi:\n"); puts(s); printf("\n"); ///////////////////////////// for(j=0;j<len_s;j++) { if(s[j]>='a'&&s[j]<='z') s[j]=s[j]-32; } puts("Chuyen doi chuoi thanh chu hoa:\n"); puts(s); printf("\n"); } //end code xulychuoi.c Bc 2. To cc file i tng .o t cc hm va vit. gcc -c nhap3so.c gptb2.c xulychuoi.c nhapchuoi.c Bc 3. Nn cc file i tng va to thnh mt file th vin .a, tip u ng lib. Vd: libstatic.a ar cvr libstatic.a nhap3so.o gptb2.o nhapchuoi.o xulychuoi.o

ng dng th vin lin kt tnh libstatic.a : 1. Vit chng trnh gii phng trnh bc hai. 2. Vit chng trnh tng hp: - Gii phng trnh bc hai
Phn: H i u hnh Linux Trang 38

Mn hc: L p trnh h thng

X l chui c bn

1. Chng trnh gii phng trnh bc hai a. To file tiu .h - khai bo thuc tnh cho cc hm s dng trong chng trnh. gedit header_gpt.h //code header_gpt.h void nhap3so(); void gptb2(); //end code header_gpt.h b. To file v vit code chng trnh chnh gedit main_gpt.c //code main_gpt.c #include "header_gpt.h" void main(void) { nhap3so(); gptb2(); } //end code main_gpt.c c. Bin dch chng trnh chnh lin kt vi th vin tnh libstatic.a gcc main_gpt.c -o main_gpt libstatic.a -lm d. Thc thi chng trnh ./main_gpt 2. Chng trnh tng hp - Gii phng trnh bc 2: ax^2+bx+c =0 (a#0) - X l chui c bn a. To file tiu .h- khai bo thuc tnh cho cc hm s dng trong chng trnh gedit header.h //code header.h
Phn: H i u hnh Linux Trang 39

Mn hc: L p trnh h thng

void nhap3so(); void gptb2(); void nhapchuoi(); void xulychuoi(); //end code header.h b. To file v vit code chng trnh chnh gedit main_th.c //code main_th.c #include <stdio.h> #include <string.h> #include "header.h"

void main(void) { int choice; char exit; do { printf("Menu Chuong Trinh\n"); printf("1) Xu ly chuoi ky tu\n"); printf("2) Giai phuong trinh ax^2+bx+c=0\n"); printf("3) Thoat chuong trinh\n"); printf("Lua chon yeu cau : \n"); scanf("%d",&choice); switch(choice) { case 1: nhapchuoi(); xulychuoi(); break; case 2: nhap3so(); gptb2();
Phn: H i u hnh Linux Trang 40

Mn hc: L p trnh h thng

break; case 3: break; default : printf("Phai nhap 1, 2 hoac 3\n"); }; printf("Thoat chuong trinh ? (y/n)\n"); while(getchar() != '\n'); scanf("%c",&exit);

}while(exit == 'n'); } //end code main_th.c c. Bin dch chng trnh chnh lin kt vi th vin tnh libstatic.a gcc main_th.c -o main_th libstatic.a -lm d. Thc thi chng trnh ./main_th

u im: Chng trnh s dng th vin lin kt tnh c th chy c lp vi th vin sau khi c bin dch chy c trn cc my tnh khc nhau. Nhc im: Tn khng gian a: o Ton b m thc thi ca cc hm trong th vin s c nhng vo file thc thi ca chng trnh chnh. o Nhiu chng trnh khc nhau khng th cng dng chung mt th vin duy nht. o C nhng hm trong th vin m chng trnh chnh khng dng n cng c lin kt vi chng trnh chnh khi bin dch. Hn ch trong vic sa i, nng cp th vin lin kt tnh v cc chng trnh s dng th vin lin kt tnh :
Trang 41

Phn: H i u hnh Linux

Mn hc: L p trnh h thng

o Khi mun sa i hoc nng cp th vin th phi thay i hoc thm m ngun cho cc hm trong th vin, dn n vic phi bin dch li t u m ngun to ra file th vin .a. o Chng trnh s dng th vin lin kt tnh nu mun tn dng nhng tnh nng mi ca th vin th cng phi c bin dch li.

b. Th vin lin kt ng i. Khi nim th vin lin kt ng Th vin lin kt ng l th vin m cc hm trong th vin khng c trc tip a vo chng trnh lc bin dch v lin kt. Trnh lin kt ch lu thng tin tham chiu n cc hm trong th vin. Vo lc chng trnh thc thi, h iu hnh s np cc chng trnh lin kt cn tham chiu vo b nh. ii. To th vin lin kt ng Gm 3 bc c bn: Bc 1. Vit cc hm cho th vin.(tng t nh th vin lin kt tnh) Bc 2. To cc file i tng .o t cc hm va vit a vo th vin lin kt ng ( s dng gcc vi ty chn -fpic). Bc 3. To file th vin lin kt ng (.so, tip u ng lib) , t cc file i tng va to, s dng gcc vi ty chn shared. V d: To mt th vin lin kt ng, cha cc hm vi chc nng nh sau: nhap3so: cho nhp vo 3 s thc. gptb2: gii phng trnh ax^2+bx+c=0, (a # 0) nhapchuoi: cho nhp vo chui k t. xulychuoi: nh dng c bn chui k t.

Bc 1. Vit cc hm cho th vin. gedit nhap3so.c //code nhap3so.c


Phn: H i u hnh Linux Trang 42

Mn hc: L p trnh h thng

#include<stdio.h> float a,b,c; void nhap3so() { printf("Ham nhap 3 so thuc : \n"); printf("Nhap cac he so : \n"); printf("Nhap a:\n"); scanf("%f",&a); printf("Nhap b:\n"); scanf("%f",&b); printf("Nhap c:\n"); scanf("%f",&c); } //end code nhap3so.c

gedit gptb2.c //code gptb2.c #include<stdio.h> #include<math.h> float a,b,c; void gptb2() {

float x,x1,x2; float delta=b*b-4*a*c; if(delta>0) { x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); printf("Phuong trinh co 2 nghiem phan biet:\n"); printf("x1=%.2f , x2=%.2f ",x1,x2);
Phn: H i u hnh Linux Trang 43

Mn hc: L p trnh h thng

} else if(delta==0) { x=-b/(2*a); printf("Phuong trinh co nghiem kep:\n"); printf("x1=x2=%.2f ",x); } else { printf("Phuong trinh vo nghiem !\n"); } } //end code gptb2.c

gedit nhapchuoi.c //code nhapchuoi.c #include <string.h> #include <stdio.h> char s[100]; void nhapchuoi() {

puts("Ham nhap chuoi ki tu : \n"); puts("Nhap vao mot chuoi ki tu: \n"); while(getchar() != '\n'); gets(s); } //end code nhapchuoi.c gedit xulychuoi.c //code xulychuoi.c
Phn: H i u hnh Linux Trang 44

Mn hc: L p trnh h thng

#include<string.h> #include<ctype.h> #include<stdio.h> char s[100]; void xulychuoi() {

int len_s,i,j; len_s=strlen(s); printf("Do dai chuoi la %d\n",len_s); printf("\n"); //////////////////////////// for(i=0;i<len_s;i++) { if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32; } puts("Chuyen doi chuoi thanh chu thuong\n"); puts(s); printf("\n"); ///////////////////////////// for(j=0;j<len_s;j++) { if(j==0) s[0]=toupper(s[0]); if(s[j]==32) s[j+1]=toupper(s[j+1]); } puts("Viet hoa ki tu dau trong chuoi:\n"); puts(s); printf("\n");
Phn: H i u hnh Linux Trang 45

Mn hc: L p trnh h thng

///////////////////////////// for(j=0;j<len_s;j++) { if(s[j]>='a'&&s[j]<='z') s[j]=s[j]-32; } puts("Chuyen doi chuoi thanh chu hoa:\n"); puts(s); printf("\n"); } //end code xulychuoi.c Bc 2. To cc file i tng .o t cc hm va vit a vo th vin lin kt ng ( s dng gcc vi ty chn -fpic). gcc -c -fpic nhap3so.c gptb2.c nhapchuoi.c xulychuoi.c Bc 3. To file th vin lin kt ng (.so, tip u ng lib) , t cc file i tng va to, s dng gcc vi ty chn -shared. gcc -shared nhap3so.o gptb2.o nhapchuoi.o xulychuoi.o -o libdynamic.so (trong libdynamic.so l tn th vin lin kt ng)

ng dng th vin lin kt ng libdynamic.so: 1. 2. Vit chng trnh gii phng trnh bc hai. Vit chng trnh tng hp: Gii phng trnh bc hai X l chui c bn

1. Chng trnh gii phng trnh bc hai a. To file v vit code chng trnh chnh gedit main_gpt2.c //code main_gpt.c void main(void) {
Phn: H i u hnh Linux Trang 46

Mn hc: L p trnh h thng

nhap3so(); gptb2(); } //end code main_gpt2.c


b. Bin dch chng trnh s dng th vin lin kt ng libdynamic.so

gcc main_gpt2.c -o main_gpt2 -L. -ldynamic -lm Ty chn -L. -ldynamic : ch ra cho trnh lin kt tm n th vin dynamic trong th mc hin hnh lu thng tin tham chiu cc hm dng trong chng trnh chnh.
c. Chy file thc thi va to

nh ng dn bin mi trng ch n th mc hin hnh ni cha th vin libdynamic.so cn tham chiu.

LD_LIBRARY_PATH=.: export LD_LIBRARY_PATH ./main_gpt2 2. Chng trnh tng hp X l chui k t c bn nhp t bn phm Gii phng trnh bc hai: ax^2+bx+c=0, (a#0) a. To file v vit code chng trnh chnh Chy file thc thi:

gedit main_th2.c //code main_th2.c #include <stdio.h> #include <string.h> void main(void) { int choice; char exit; do {
Phn: H i u hnh Linux Trang 47

Mn hc: L p trnh h thng

printf("Menu Chuong Trinh\n"); printf("1) Xu ly chuoi ky tu\n"); printf("2) Giai phuong trinh ax^2+bx+c=0\n"); printf("3) Thoat chuong trinh\n"); printf("Lua chon yeu cau : \n"); scanf("%d",&choice); switch(choice) { case 1: nhapchuoi(); xulychuoi(); break; case 2: nhap3so(); gptb2(); break; case 3: break; default : printf("Phai nhap 1, 2 hoac 3\n"); }; printf("Thoat chuong trinh ? (y/n)\n"); while(getchar() != '\n'); scanf("%c",&exit); }while(exit == 'n'); } //end code main_th2.c
b. Bin dch chng trnh s dng th vin lin kt ng libdynamic.so

gcc main_th2.c -o main_th2 -L. -ldynamic -lm


c. Chy file thc thi va to

./main_th2 u im: Tit kim khng gian a:


Trang 48

Phn: H i u hnh Linux

Mn hc: L p trnh h thng

o File thc thi ca chng trnh chnh khng cha m thc thi ca cc hm trong th vin. o Nhiu chng trnh khc nhau c th cng dng chung mt th vin duy nht. Chng trnh s dng th vin lin kt ng khng phi c bin dch li m vn c th s dng nhng tnh nng mi ca th vin (trong trng hp th vin c sa i, nng cp).

Khuyt im: Chng trnh s dng th vin lin kt ng khng th chy c lp vi th vin chng trnh ph thuc hon ton vo th vin. Hn ch khi mun sa i hoc nng cp: Khi mun sa i hoc thm hm cho th vin, vn phi thc hin li cc bc nh khi to th vin ban u(tng t th vin lin kt tnh).

Kt lun v u, nhc im trong vic lp trnh ngn ng C trn Linux s dng th vin lin kt ng v lin kt tnh : Kch thc file thc thi: Xem li cc chng trnh trong 2 video trc, cng mt m ngun nhng vic s dng loi th vin lin kt khc nhau dn n kch thc file thc thi khc nhau: chng trnh s dng th vin lin kt tnh lun c kch thc file ln hn chng trnh s dng th vin lin kt ng. File thc thi main_gpt main_th Th vin lin kt tnh 7.2KB 7.5KB Th vin lin kt ng 7.0KB 7.2KB

Kh nng c lp ca chng trnh thc thi vi th vin: o Chng trnh s dng th vin lin kt tnh c kh nng chy c lp vi th vin sau khi c bin dch. o Chng trnh s dng th vin lin kt ng ph thuc vo th vin, khng th chy c lp vi th vin. Kh nng chnh sa, thay i ca chng trnh ng dng:

Phn: H i u hnh Linux

Trang 49

Mn hc: L p trnh h thng

o Do tnh c lp ca chng trnh s dng th vin lin kt tnh nn nu mun chnh sa chng trnh ng dng th cn phi bin dch li chng trnh cng vi th vin m n lin kt. o Chng trnh s dng th vin lin kt ng c th tn dng trc tip ngay nhng s thay i ca th vin m n lin kt, khng cn phi c bin dch li. Ni tm li, ta c bng sau: Chng trnh ng dng Kch thc Tnh c lp Kh nng chnh sa, nng cp Th vin lin kt tnh Ln C Hn ch Th vin lin kt ng Nh Khng H tr

Ty vo mc ch, kh nng, quy m cng nh phm vi chng trnh ng dng m ngi lp trnh cn cn nhc trong vic la chn s dng loi th vin lin kt cho ph hp nht.

B.

Makefile: s dng trong bin dch m ngun.


Cu lnh make thng c t ngi dng quan tm n. Thng thng cu lnh ny

v Makefile nm trong nhm m ngun h tr bin dch v lin kt m ngun trong file thc thi. Tuy nhin n cn c th c s dng thc hin nhiu tnh nng khc ngoi vic x l m ngun. Makefile l mt chui lnh thc thi, lm vic trn cc phn ph ca file mc tiu. V d, bn c th chy lnh make install v lnh ny s kim tra cp nht nhng i tng c yu cu trc tin, nh mc tiu compile v cc thnh phn ph ca n. iu ny lm cho lnh make tr thnh mt lnh rt linh hot. iu ny cng c ngha bn c th s dng n vi nhiu file ngoi tr file m ngun; bn c th s dng Makefile copy file (cc b hay t xa), kim sot phin bn, xa file, hay nhng lnh khc c th s dng khi x l file. Trong bi ny chng ta tp trung vo mc tiu s dng Makefile trong bin dch m ngun i vi lp trnh C. 1. V sao ta phi dng Makefile? Cc chng trnh qu ln:
Phn: H i u hnh Linux Trang 50

Mn hc: L p trnh h thng

- C rt nhiu dng code - Cc thnh phn phc tp. - Nhiu hn 1 ngi lp trnh Cc vn : - Cc file di kh qun l (cho c ngi lp trnh v my). - Mi thay i i hi s bin dch di. Nhiu ngi lp trnh khng th chnh sa cc file ng thi. Gii php: chia project(d n/cng trnh) thnh cc file. Mc tiu: Phn chia tt cc thnh phn Ti thiu s bin dch khi c g thay i. D dng bo tr cu trc project, s ph thuc v s sng to.

. Makefile : ,

CC=gcc # the C compiler is gcc CFLAGS=-g -Wall -I/usr/include/libxml2 LIBS=-lxml2 tut_prog: main.o aux.o $(CC) $(LIBS) main.o aux.o -o tut_prog main.o: main.c $(CC) -c $(CFLAGS) main.c aux.o: aux.c $(CC) -c $(CFLAGS) aux.c
.

N) , CFLAGS, LIBS
Phn: H i u hnh Linux Trang 51

Mn hc: L p trnh h thng

. : +CC CXX CPP RM CFLAGS $(cc) e f gcc ++

LDFLAGS

Phn: H i u hnh Linux

Trang 52

Mn hc: L p trnh h thng

2. target: command ... ... target thng l tn ca file c to ra bi chng trnh, hoc cng c th l cc ch nh thc thi mt hoc mt lot tc v no . Cc target khng c bt u bng du '.' - prerequisite l file hoc cc file u vo hoc ph thuc to ra target. target thng ph thuc vo cc file ny, khi cc file ny thay i (do chnh sa m ngun->thi gian lu ca file b thay i) th target s c bin dch li. - command l lnh hoc tp lnh m trnh make s thc thi. Mt rule (quy tc) c th c nhiu lnh (command), mi lnh thng c vit trn mt dng. Ch : trc mi dng lnh bn cn phi c du tab. Du '\' cui dng quy nh dng di tip theo thc cht cng l dng trn, v dng trn di qu, nn chng ta c th ngt xung di bng du ny. Cc bin: Cc bin c dng rt gn, khai bo c dng sau: var=text1text2..textn Khi s dng tham chiu ta dng theo dng $(var) . . : all check clean distclean dist install uninstall 1. S dng cc bin trong Makefile
Phn: H i u hnh Linux Trang 53

prerequisites.

(tar.gz) )

Mn hc: L p trnh h thng

To ra Makefile: Ni dung ca Makefile ca project nh sau: Code: USER_DIR=.. LIB_DIR=$(USER_DIR)/libraries MAIN_FILE_DIR=$(USER_DIR)/mainFile INC=-I$(LIB_DIR) #compiler CC=gcc FLAG= #source STUB=$(LIB_DIR)/ipc.c $(LIB_DIR)/person.c #nameofmainfile MAIN_FILE_NAME=sample1 #object OBJECT= #The Target run: ready code $(CC)$(INC)$(FLAG)$(MAIN_FILE_NAME).o$(OBJECT)-o run ready: $(CC)$(INC)$(FLAG) code: $(CC) $(INC) $(FLAG) -c $(MAIN_FILE_DIR)/$(MAIN_FILE_NAME).c clean rm -rf *.o run Nhng t vit in hoa l cc bin mi trng (such as: USER_DIR, GXX, FLAG, MAIN_FILE_NAME,....) sau du = ca cc bin mi trng l ni dung c gn cho cc bin Vd: USER_DIR=.. <-- bin USER_DIR vi ni dung l ".." LIB_DIR= $(USER_DIR)/libraries <-- bin LIB_DIR vi ni dung l "../libraries" -c $(STUB) ipc.o person.o -Wall-g-W

Phn: H i u hnh Linux

Trang 54

Mn hc: L p trnh h thng

Mt s li khuyn khi to Makefile: - Bn nn to ra bin mi trng: v d trn nu khng dng bin mi trng m vit thng trong cc target dng lnh lun, tc l Makefile ca tr thnh: Code: run: ready code gcc -I../libraries -Wall -g -W sample1.o ipc.o person.o -o run ready: gcc -I../libraries -Wall -g -W -c ../libraries/ipc.c ../libraries/person.c code: gcc -I../libraries -Wall -g -W -c ../mainFile/sample1.c clean: rm -rf *.o run th Makefile vn hot ng bnh thng tuy nhin make file ny ch c th dch cho mi file sample1.c hoc nu mun thay thnh sample2.c th phi thay c run,code. Nn to ra Target c chc nng tng t target clean: Khi lm vic vi project ln th vic to clean kh quan trng v khi gi n s xa i nhng g c gi l rc trong qu trnh build nh l nhng file object hoc file executable c chng hn.

3. V d Demo s dng Makefile Vit chng trnh cho php nhp vo mt s nguyn, yu cu xut ra mn hnh s va nhp l chn hay l ? Cc bc thc hin: To file main.c Code: #include <stdio.h> #include "header.h" void main(void) { int num; printf("Nhap vao mot so: \n");
Phn: H i u hnh Linux Trang 55

// chng trnh chnh

Mn hc: L p trnh h thng

scanf("%d",&num); if(odd_even(num)) printf("%d la so chan \n",num); else printf("%d la so le \n",num); printf("\n"); } 1. To file function.c Code: int odd_even(int x) { if(x % 2 == 0) return 1; else return 0; } 2. To file header.h // khai bo nguyn hm nguyn mu Code: int odd_even(int x); To file Makefile // ni dung make Code khng s dng bin: main: main.ofunction.o gcc main.o function.o -o main main.o: main.c // hm phn bit chn l

gcc -c main.c function.o: function.c header.h

gcc -c function.c clearn: rm *.o

Phn: H i u hnh Linux

Trang 56

Mn hc: L p trnh h thng

- Code c s dng bin: USER_DIR=.. WORK_DIR=$(USER_DIR)/Desktop/makefile CC=gcc OBJECT=main.o function.o MAIN_FILE=main MAIN_FILE: $(OBJECT) $(CC) $(OBJECT) -o $(MAIN_FILE) $(WORK_DIR)/main.o: $(WORK_DIR)/main.c CC -c $(WORK_DIR)/main.c $(WORK_DIR)/function.o: $(WORK_DIR)/function.c CC -c $(WORK_DIR)/function.c clearn: rm *.o 3. T Terminal vi ng dn trong th mc cc file va to, g lnh : a. make // thc thi Makefile b. ./main // chy chng trnh c. make clean // xa file .o ( khng cn thit)

Phn: H i u hnh Linux

Trang 57

You might also like