際際滷

際際滷Share a Scribd company logo
.: CNG NGH畛 LINUX :. M担n h畛c: KHA 3 CH働NG TRNH O T畉O TH畉C S懲 CNTT QUA M畉NG 畉I H畛C QU畛C GIA TP. H畛 CH MINH TR働畛NG 畉I H畛C CNG NGH畛 THNG TIN Gi畉ng vi棚n:  TS. T担 Tu畉n (Vi畛n CNTT, BQP) Email: totuan4@yahoo.com Tr畛 l箪 k畛 thu畉t:  Nguy畛n V畉n Ph炭c, V滴 M畉nh C動畛ng
Ch動董ng 4:  Nh畉p m担n l畉p tr狸nh Linux Bao g畛m c叩c ph畉n sau: Linux v Unix C畛ng 畛ng GNU v General Public License  L畉p tr狸nh tr棚n Linux Ch動董ng tr狸nh Unix v Linux Ch動董ng tr狸nh Linux 畉u tay helloworld.c T狸m tr畛 gi炭p v畛 tr狸nh bi棚n d畛ch Ph叩t tri畛n ch動董ng tr狸nh v畛i ng担n ng畛 C Th動 vi畛n li棚n k畉t tr棚n Linux CITD - VNUHCM
4.1. Linux v Unix Unix 動畛c 叩nh gi叩 l m畛t HH m畉nh, 畛n 畛nh. Tr動畛c 但y 動畛c xem l m畛t HH m達 ngu畛n m畛 v t畛 khi Sun Microsystems n但ng c畉p l棚n thnh m畛t s畉n ph畉m th動董ng m畉i    m畉t d畉n t鱈nh m畛 c畛a HH Unix. C叩c d嘆ng s畉n ph畉m Server c畛a Microsoft 達 v ang c畉nh tranh v畛i c叩c d嘆ng t動董ng 動董ng thu畛c h畛 UNIX (nh動 FreeBSD,  Linux, Debian, SCO Unix,) Theo d嘆ng l畛ch s畛 th狸 v畛i vi畛c k畉 th畛a v ph叩t huy nh畛ng t鱈nh nng n畛i b畉t c畛a m畛t HH 達 qua th畛 th叩ch - UNIX  { m達 ngu畛n m畛 + t鱈nh 畛n 畛nh }    Linux 達 動畛c 畛ng h畛 v 動畛c s畛 d畛ng b畛i c畛ng 畛ng tr棚n ton th畉 gi畛i
M畛t s畛 t鱈nh nng kh叩c c畛a  HH Linux  so v畛i  HH Unix : L h畉t nh但n cung c畉p c叩c ch畛c nng c畉n thi畉t t畛i thi畛u c畛a HH t畛a Unix ( Linux gi畛ng Unix g畉n 98% ) L m畛t s畉n ph畉m c坦 gi叩 tr畛 do Unix kh担ng c坦 phi棚n b畉n ch畉y tr棚n h畛 m叩y PC v畛i ki畉n tr炭c Intel
Ch動董ng tr狸nh vi畉t tr棚n Unix 畛u c坦 th畛 ch畉y t畛t tr棚n Linux v ng動畛c l畉i Linux 達 動畛c ph叩t tri畛n d畛a tr棚n vi畛c t畉n d畛ng nh畛ng 動u i畛m v kh畉c ph畛c nh畛ng khuy畉t i畛m c畛a c叩c HH t畛a UNIX Linux ngy nay 動畛c s畛 d畛ng r畛ng r達i v ch鱈nh do y畉u t畛 ph畛 bi畉n tr棚n 達 動畛c s畛 h畛 tr畛 gi炭p 畛 c畛a kh叩 nhi畛u c畛ng 畛ng ng動畛i d湛ng tr棚n th畉 gi畛i
4.2. C畛ng 畛ng GNU v General Public License   Ngoi HH, c嘆n c坦 c叩c ch動董ng tr狸nh 畛ng d畛ng ph畛c v畛 cho y棚u c畉u c畛a ng動畛i d湛ng C畛ng 畛ng Open Source 達 x但y d畛ng nhi畛u 畛ng d畛ng c坦 kh畉 nng ch畉y 動畛c tr棚n Unix/Linux v nh狸n chung theo xu h動畛ng hi畛n 畉i nh畉m l担i k辿o ng動畛i d湛ng Linux theo ph動董ng ch但m Windows c坦 g狸 ~ Linux c坦 t動董ng 畛ng nh動 v畉y
- GNU   { G NUs  N ot  U NIX }  GNU theo nguy棚n g畛c ti畉ng Anh l linh d動董ng 畉u b嘆 <=> l bi畛u t動畛ng c畛a t畛 ch畛c c畛ng 畛ng m達 ngu畛n m畛 Tham kh畉o c叩c ph畉n m畛m 畛ng d畛ng mi畛n ph鱈 t畉i 畛a ch畛  http:// www.gnu.org/software/software.html   Khi s畛 d畛ng c叩c ph畉n m畛m c畛a t畛 ch畛c GNU th狸 c畉n ph畉i tu但n th畛 m畛t s畛 quy 畛nh c畛a t畛 ch畛c tr棚n    Gi畉y ph辿p ch畛ng nh畉n GPL c嘆n g畛i l  copyleft  thay cho  copyright  cho c叩c ch畛ng nh畉n b畉n quy畛n th動董ng m畉i
M畛t s畛 b畛 c担ng c畛 bi棚n d畛ch C/C++:  ngh挑a Tr狸nh bi棚n d畛ch B畛 ph但n t鱈ch t動董ng th鱈ch  yacc  c畛a UNIX Bison H畛 v畛 Shell h畛 tr畛 c董 ch畉 d嘆ng l畛nh bash Tr狸nh so畉n th畉o vn b畉n GNU Emacs Tr狸nh qu畉n l箪 m達 ngu畛n v qu畉n l箪 th動 vi畛n GNU make Tr狸nh g畛 l畛i gdb Tr狸nh bi棚n d畛ch C++ g++ Tr狸nh bi棚n d畛ch C gcc
4.3. L畉p tr狸nh tr棚n Linux Nguy棚n th畛y Unix 動畛c vi畉t b畉ng C v ph畉n l畛n c叩c 畛ng d畛ng tr棚n Unix 動畛c vi畉t b畉ng C Ngoi C l l畛a ch畛n duy nh畉t, c坦 th畛 s畛 d畛ng Pascal, Assembly ho畉c Perl 畛 x但y d畛ng c叩c ch動董ng tr狸nh cho Linux UNIX Bourne Shell Tcl / Tk SQL Smalltalk Scheme Python Prolog PostScript Perl Pascal Objective C Oberon Modula 3 Modula 2 Lisp JavaScript Java Icon Fortran Forth Eiffel C++ C Ada
4.4. Ch動董ng tr狸nh Unix v Linux Ch動董ng tr狸nh tr棚n Unix v Linux t畛n t畉i 畛 hai d畉ng: D畉ng th畛c thi (t畉p tin nh畛 ph但n) D畉ng th担ng d畛ch (t畉p tin script)    File ch動董ng tr狸nh th畛c thi ~ nh動 t畉p tin  .exe  c畛a MS-DOS/Windows    File script l nh畛ng ch畛 th畛 l畛nh 動畛c th畛c thi b畛i shell hay tr狸nh th担ng d畛ch no 坦 (Perl, Python, Tcl, ...)    t動董ng t畛 nh動 c叩c t畉p tin  .bat  c畛a MS-DOS, VBScript v JavaScript c畛a Windows Script Host - C叩c file script v ch動董ng tr狸nh nh畛 ph但n 畛u c坦 kh畉 nng v m畉nh ngang nhau    Do v畉y, l炭c th畛c thi kh坦 ph但n bi畛t 動畛c 但u l l畛nh g畛i ch動董ng tr狸nh nh畛 ph但n v 但u l l畛nh th畛c hi畛n script - Khi ch動董ng tr狸nh 動畛c g畛i, Linux s畉 t狸m 動畛ng d畉n 畉n n董i ch畛a t畉p tin ch動董ng tr狸nh trong bi畉n m担i tr動畛ng  PATH . Th担ng th動畛ng, bi畉n ny ch畛a c叩c 動畛ng d畉n sau  /bin ,  /user/bin ,  /usr/local/bin
- 畛i v畛i ng動畛i qu畉n tr畛 h畛 th畛ng, c坦 th棚m m畛t s畛 動畛ng d畉n tr畛 畉n th動 m畛c  /sbin ,  /usr/sbin - Unix/Linux s畛 d畛ng d畉u  :  畛 ph但n c叩ch c叩c 動畛ng d畉n trong bi畉n m担i tr動畛ng  PATH , trong khi MS-DOS d湛ng d畉u  ;  - V鱈 d畛: PATH = /bin: /user/bin: /usr/local/bin:.:
4.5. Ch動董ng tr狸nh Linux 畉u tay ( Helloworld.c ) D湛ng tr狸nh so畉n th畉o b畉t k畛 (trong Console Mode) 畛 so畉n th畉o source code nh動:    vi    cat    D湛ng ch畛c nng Edit trong mc (Midnight Commander)    v.v... - C叩ch s畛 d畛ng:    vi helloworld.c    cat > helloworld.c - M畛t giao di畛n kh叩c t動董ng t畛 nh動 trong Turbo C c畛a Borland th狸 s畛 d畛ng tr狸nh so畉n th畉o  wpe  (cho ph辿p k畉t h畛p ch畛c nng bi棚n d畛ch c畛a  cc, gcc, pascal ) - Tham kh畉o  V鱈 d畛 4-1 :  helloworld.c
Windows Programming Environment  (WPE) ==  -----  -----  == H狸nh 4.1 Tr狸nh wpe trong ch畉 畛 Console
Windows Programming Environment  (WPE) ==  -----  -----  == H狸nh 4.2 Tr狸nh wpe trong ch畉 畛 X-Windows
- S畛 d畛ng  gcc  (ho畉c  cc ) 畛 bi棚n d畛ch nh動 sau: # gcc helloworld.c -o helloworld # ./helloworld Hello World #
4.6. T狸m tr畛 gi炭p v畛 tr狸nh bi棚n d畛ch Trong tr狸nh  gcc  c坦 r畉t 鱈t t湛y ch畛n (-o, -g, -l, -I, v.v...). S畛 d畛ng l畛nh  man  畛 tham kh畉o th棚m m畛t s畛 tu畛 ch畛n kh叩c. Trong b畛 ch動董ng tr狸nh GNU c滴ng k竪m theo ch動董ng tr狸nh  info  c坦 動u i畛m l h動畛ng d畉n s畛 d畛ng ph畉n m畛m r畉t chi ti畉t. C叩ch th畛c d湛ng l畛nh  info  nh動  man.
4.7. Ph叩t tri畛n ch動董ng tr狸nh v畛i ng担n ng畛 C S畛 d畛ng ng担n ng畛 C lm ng担n ng畛 ch鱈nh trong ch動董ng tr狸nh Ng担n ng畛 l畉p tr狸nh C kh担ng ph畛 thu畛c vo HH no 4.7.1. Ch動董ng tr狸nh tr棚n Linux C畉n n畉m r探 v畛 tr鱈 畉t ti nguy棚n 畛 x但y d畛ng ch動董ng tr狸nh nh動 tr狸nh bi棚n d畛ch, file th動 vi畛n, c叩c file header khai b叩o hm v c畉u tr炭c d畛 li畛u, ... Tr狸nh bi棚n d畛ch  gcc  th動畛ng 動畛c 畉t trong  /usr/bin  ho畉c  usr/local/bin . Khi bi棚n d畛ch,  gcc  c畉n nhi畛u file h畛 tr畛 nh動 c叩c t畉p tin th動 vi畛n li棚n k畉t (trong  /lib  ho畉c  /usr/local/lib ), c叩c file C header (trong  /usr/include  ho畉c  /usr/local/include ), v.v... Ch動董ng tr狸nh sau khi bi棚n d畛ch c坦 th畛 畉t b畉t k畛 但u tr棚n h畛 th畛ng mi畛n l HH c坦 th畛 t狸m th畉y trong bi畉n m担i tr動畛ng  PATH  ho畉c theo 動畛ng d畉n tuy畛t 畛i trong d嘆ng l畛nh.
4.7.2. C叩c file header File header trong C ch畛a 畛nh ngh挑a c叩c hm, c叩c h畉ng c湛ng v畛i nh畛ng c畉u tr炭c d畛 li畛u c畉n cho qu叩 tr狸nh bi棚n d畛ch V鱈 d畛 m畛t khai b叩o header trong C: #include <sys/types.h> - Tr狸nh bi棚n d畛ch s畉 t狸m file header c坦 t棚n l  types.h  trong th動 m畛c  /usr/include/sys - 畛i v畛i c叩c hm l畉p tr狸nh 畛 ho畉 X-Window, c叩c file header n畉m trong th動 m畛c  /usr/include/X11 - S畛 d畛ng t湛y ch畛n  -I  畛 ch畛 ra th動 m畛c ch畛a c叩c file header c畛a ri棚ng m狸nh (kh叩c v畛i th動 m畛c m畉c 畛nh c畛a h畛 th畛ng). - V鱈 d畛: # gcc I /usr/mypro/include test.c -o test - Xem th担ng tin v畛 c叩c hm trong th動 vi畛n # man <function name>
4.7.3. C叩c file th動 vi畛n 畛 t畉o ra ch動董ng tr狸nh th畛c thi, c畉n c坦 c叩c file th動 vi畛n Trong Linux, c叩c file th動 vi畛n th動畛ng l  .a  ,   .so  ,  . sa  v 動畛c b畉t 畉u b畉ng ti畉p 畉u ng畛  lib . V鱈 d畛:  libutil.a  ho畉c  libc.so      但y l t棚n c叩c th動 vi畛n trong Linux - C坦 2 lo畉i th動 vi畛n li棚n k畉t:   Li棚n k畉t 畛ng (Dynamic)   Li棚n k畉t t挑nh (Static) - Khi bi棚n d畛ch, th担ng th動畛ng ch動董ng tr狸nh li棚n k畉t ( ld ) s畉 t狸m th動 vi畛n trong 2 th動 m畛c chu畉n  /usr/lib  v  /lib
4.8. Th動 vi畛n li棚n k畉t tr棚n Linux H狸nh th畛c 董n gi畉n nh畉t c畛a th動 vi畛n l t畉p h畛p c叩c file 畛i t動畛ng  .o  do tr狸nh bi棚n d畛ch t畉o ta 畛 b動畛c bi棚n d畛ch v畛i t湛y ch畛n  -c #gcc -c helloworld.c - L炭c ny tr狸nh bi棚n d畛ch ch動a t畉o ra file th畛c thi m t畉o ra file 畛i t動畛ng  helloworld.o  (file ny ch畛a m達 m叩y c畛a ch動董ng tr狸nh 達 動畛c t畛 ch畛c l畉i ~ c叩c file  .o  ny t動董ng t畛 nh動 c叩c file  .obj  do tr狸nh bi棚n d畛ch C sinh ra tr棚n DOS ho畉c Windows) - 畛 t畉o ra file th畛c thi, th畛c hi畛n b動畛c cu畛i c湛ng (g畛i linker  ld ) # gcc helloworld.o -o helloworld - N畉u kh担ng d湛ng kho叩 chuy畛n  -c  th狸 tr狸nh bi棚n d畛ch s畉 th畛c hi畛n c畉 hai b動畛c tr棚n 畛ng th畛i.
4.8.1. Th動 vi畛n li棚n k畉t t挑nh L c叩c th動 vi畛n khi li棚n k畉t tr狸nh bi棚n d畛ch s畉 l畉y ton b畛 m達 th畛c thi c畛a hm trong th動 vi畛n 動a vo ch動董ng tr狸nh ch鱈nh. Ch動董ng tr狸nh s畛 d畛ng th動 vi畛n li棚n k畉t t挑nh ny ch畉y 畛c l畉p v畛i th動 vi畛n sau khi bi棚n d畛ch. Do 坦 khi c畉n s畛a ch畛a ho畉c n但ng c畉p     Bi棚n d畛ch l畉i Tham kh畉o  V鱈 d畛 4-2:   fred.c Tham kh畉o  V鱈 d畛 4-3:   bill.c Ti畉n hnh bi棚n d畛ch 畛 t畉o ta 2 file 畛i t動畛ng  .o  #gcc -c fred.c bill.c T畉o file ti棚u 畛 畛 khai b叩o c叩c hm nguy棚n m畉u c畛a ng動畛i s畛 d畛ng Tham kh畉o  V鱈 d畛 4-4:   lib.h - Ch動董ng tr狸nh ch鱈nh tri畛u g畛i 2 hm tr棚n:  V鱈 d畛 4-5:   program.c
Sau khi bi棚n d畛ch thnh c叩c t畉p tin .o, c畉n t畉o t畉p tin th畛c thi nh動 sau: # gcc program.o bill.o fred.o o program C叩ch t畉o th動 vi畛n li棚n k畉t t挑nh: # ar cvr libfoo.a bill.o fred.o Bi棚n d畛ch v h畛p nh畉t v畛i th動 vi畛n li棚n k畉t t挑nh: # gcc program.c o program L. -lfoo
4.8.2. Th動 vi畛n li棚n k畉t 畛ng 4.8.2.1. T畉o v s畛 d畛ng th動 vi畛n li棚n k畉t 畛ng .so Th動 vi畛n li棚n k畉t t挑nh c坦 nh動畛c i畛m:     Ph畉i  nh炭ng  m達 nh畛 ph但n k竪m theo ch動董ng tr狸nh khi li棚n k畉t, d畉n 畉n t狸nh tr畉ng t畛n kh担ng gian 挑a n畉u nh動 c坦 ch動董ng tr狸nh y棚u c畉u s畛 d畛ng m畛t hm nhi畛u l畉n (v鱈 d畛 nh動 hm  printf() )     Ph畉i bi棚n d畛ch v/ho畉c li棚n k畉t l畉i khi mu畛n n但ng c畉p (ho畉c b畛 sung t鱈nh nng m畛i) - Th動 vi畛n li棚n k畉t 畛ng kh畉c ph畛c 動畛c hai v畉n 畛 tr棚n do c叩c hm th動 vi畛n li棚n k畉t 畛ng 動畛c n畉p trong th畛i gian thi hnh v c坦 th畛 動畛c d湛ng chung gi畛a nhi畛u ti畉n tr狸nh. 畛 動a hm vo th動 vi畛n li棚n k畉t 畛ng    c畉n d湛ng t湛y ch畛n  -fpic  (ho畉c  fPIC),  vi畉t t畉t c畛a   Position Independence Code
- V鱈 d畛 sau s畉 bi棚n d畛ch  fred.c  v  bill.c  thnh c叩c t畉p tin .o c坦 kh畉 nng 動a 動畛c vo th動 vi畛n li棚n k畉t 畛ng: #  gcc -c -fpic fred.c bill.c - Ti畉p 畉n t畉o th動 vi畛n li棚n k畉t 畛ng t畛 c叩c file 畛i t動畛ng  .o  tr棚n b畉ng c叩ch s畛 d畛ng t湛y ch畛n  -shared  (do th動 vi畛n li棚n k畉t 畛ng 動畛c t畉o ph畛 thu畛c vo ki畉n tr炭c c畛a HH): #  gcc -shared bill.o fred.o -o libfoo.so - C叩ch s畛 d畛ng th動 vi畛n li棚n k畉t 畛ng v畛i ch動董ng tr狸nh ch鱈nh: #  gcc program.c -o program  -L. -lfoo - V畛i c叩c tu畛 ch畛n  -L.  v  -lfoo   tr狸nh bi棚n d畛ch v li棚n k畉t  gcc  s畉 t狸m th動 vi畛n  libfoo.so  ho畉c  libfoo.a  trong th動 m畛c hi畛n hnh v t畉o ra file th畛c thi  program. - Th動 vi畛n  .so  動畛c 動u ti棚n s畛 d畛ng so v畛i  .a . N畉u kh担ng t狸m th畉y file th動 vi畛n  .so  tr棚n th狸   .a  m畛i 動畛c xem x辿t 畉n.
V鱈 d畛 minh h畛a v畛 th動 vi畛n li棚n k畉t tr棚n Windows  ==  -----  -----  ==
4.8.2.2. Th畛c thi g畛i li棚n k畉t mu畛n Th動 vi畛n li棚n k畉t 畛ng ph畉i n畉m trong /lib, /usr/lib, /usr/local/lib ho畉c th動 m畛c v畛i 動畛ng d畉n ch畛 b畛i bi畉n m担i tr動畛ng  LD_LIBRARY_PATH V鱈 d畛: #  export LD_LIBRARY_PATH=/myprog/lib:/other/lib:. #  ./program C坦 th畛 ch畛 畛ng g畛i v n畉p c叩c hm th動 vi畛n li棚n k畉t 畛ng m kh担ng c畉n nh畛 vo HH. 但y 動畛c g畛i l   hm li棚n k畉t mu畛n  Ba hm li棚n k畉t mu畛n ch鱈nh l:    dlopen()    dlsym() dlclose()
- C叩c hm tr棚n 動畛c khai b叩o nh動 sau: #include <dlfcn.h> void *dlopen (const char* lib_file, int mode); void *dlsym (void * handle, const char* funct_name); int dlclose (void *handle); - Hm  dlopen()   y棚u c畉u 動畛ng d畉n  lib_file  t畛i th動 vi畛n .so c畉n n畉p. - Hm  dlsym()  y棚u c畉u con tr畛 畉n th動 vi畛n n畉p v tr畉 v畛 tr動畛c 坦 b畛i hm  dlopen() - Hm  dlclose()  gi畉i ph坦ng th動 vi畛n tr畛 畉n b畛i  handle  do  dlopen()  n畉p tr動畛c 坦 - Tham kh畉o  V鱈 d畛 4-6:   program2.c
Ch但n thnh c畉m 董n C叩c anh/ch畛 達 tham d畛 bi gi畉ng. B畛 ph畉n Multi-media 達 h畛 tr畛 ch炭ng t担i trong qu叩 tr狸nh thuy畉t gi畉ng. K畉t th炭c ch動董ng 4 H畉n g畉p l畉i bu畛i h畛c k畉
Ch動董ng 5:  X畛 l箪 t畉p tin v th動 m畛c Bao g畛m c叩c ph畉n sau: H畛 th畛ng t 畉p tin  trong Linux C叩c c叩ch x畛 l箪  t畉p tin  trong Linux Th動 vi畛n xu畉t nh畉p chu畉n (Standard I/O Library) Hm truy xu畉t c畉p th畉p X畛 l箪 th動 m畛c CITD - VNUHCM
5.1. H畛 th畛ng t畉p tin trong Linux T畉t c畉 c叩c t畉p tin v th動 m畛c 動畛c t畛 ch畛c theo d畉ng c但y duy nh畉t G畛c c畛a c但y th動 m畛c g畛i l  root  v 動畛c k箪 hi畛u l  /  Cho d湛 m叩y t鱈nh c坦 nhi畛u 畛 挑a (ho畉c nhi畛u ph但n v湛ng, nhi畛u thi畉t b畛)    t畉t c畉 動畛c k畉t g叩n vo c叩c nh叩nh c畛a c但y th動 m畛c ch鱈nh Thao t叩c k畉t g叩n 動畛c th畛c hi畛n b畛i l畛nh  mount   H狸nh 5-1 cho th畉y th動 m畛c  /home/soft  l th動 m畛c 動畛c g叩n k畉t v畛i m畛t ph但n v湛ng c畛a 挑a c畛ng th畛 2
- Th畛c t畉, th動 m畛c trong Linux 動畛c xem nh動 m畛t t畉p tin c坦 thu畛c t鱈nh  d . H狸nh 5.1 H畛 th畛ng th動 m畛c trong Linux 挑a c畛ng 1 挑a c畛ng 2 usr etc home dev minhkhai soft book.doc office helps.txt
H狸nh 5.1.a M畛t c畉u tr炭c th動 m畛c trong Linux
5.2. C叩c c叩ch x畛 l箪  t畉p tin   trong Linux C坦 hai c叩ch truy xu畉t file:    Truy xu畉t file s畛 d畛ng v湛ng 畛m (stream file): D畛a vo c叩c hm th動 vi畛n chu畉n  stdio    Truy xu畉t file c畉p th畉p (low-level): D畛a vo c叩c l畛i g畛i h畛 th畛ng - H狸nh 5.2 l m担 h狸nh truy xu畉t ph畉n c畛ng d畛a vo th動 vi畛n chu畉n v c叩c l畛i g畛i h畛 th畛ng.
H狸nh 5.2 C叩ch tri畛u g畛i v truy xu畉t thi畉t b畛 ph畉n c畛ng 畛ng d畛ng (Application) stdio Library L畛i g畛i h畛 th畛ng (System Call) KERNEL Device Drivers Thi畉t b畛 ph畉n c畛ng (Hardware Devices) g畛i hm Kh担ng gian ng動畛i d湛ng (User Space) Kh担ng gian h畛 th畛ng (Kernel Space)
5.3. Th動 vi畛n xu畉t nh畉p chu畉n (Standard I/O Library) 動畛c khai b叩o trong  stdio.h Th動 vi畛n ny tu但n theo chu畉n ANSI    c坦 th畛 s畛 d畛ng ch炭ng h畉u nh動 tr棚n c叩c HH.     fopen(), fclose()    fread(), fwrite()    fflush()    fseek()    v.v... - T畉t c畉 c叩c hm tr棚n 畛u s畛 d畛ng con tr畛 t畛i c畉u tr炭c  FILE 5.3. Th動 vi畛n xu畉t nh畉p chu畉n (Standard I/O Library) 動畛c khai b叩o trong  stdio.h Th動 vi畛n ny tu但n theo chu畉n ANSI    c坦 th畛 s畛 d畛ng ch炭ng h畉u nh動 tr棚n c叩c HH kh叩c nhau:    fopen(), fclose()    fread(), fwrite()    fflush()    fseek()    v.v... - T畉t c畉 c叩c hm tr棚n 畛u s畛 d畛ng con tr畛 t畛i c畉u tr炭c  FILE
5.3.1. 坦ng m畛 t畉p tin - S畛 d畛ng hm  fopen() v fclose() - V鱈 d畛: /*Khai b 叩 o c 叩c  b i畉 n con tr 畛  t 畛i  c 畉 u tr 炭 c FILE*/ FILE * f_read; FILE * f_write; FILE * f_readwrite; FILE * f_append; /*M 畛  t 畉p tin  data.txt  畛 畛 c*/ f_read=fopen(/home/ch12/data.txt, r); if  (!f_read) {  /*Kh 担 ng m 畛   動畛 c t 畉p tin */ perror(Khong mo duoc file de doc...); exit (1); }
/* M 畛  t 畉p tin  logfile  trong th 動  m 畛 c hi 畛n  h  nh  畛  ghi. N 畉 u ch 動a c坦,  t 畉p tin m畛i 動畛c t畉o;  N 畉 u  達 c坦,  n 畛i dung c滴 b畛 x坦a  */ f_write=fopen(logfile.txt, w); /* M 畛  /usr/local/db/users  畛   畛c v ghi  */ f_readwrite=fopen(/usr/local/db/users, rw); /* M 畛  /var/adm/messages  畛 n畛i th棚m d畛 li畛u vo cu畛i  */ f_append=fopen(/var/adm/messages, a); /*  坦ng t畉p tin ang m畛  */ if  (!fclose(f_readwrite)) { perror(Khong the dong file duoc...); exit (1); }
5.3.2. 畛c t畛   t畉p tin - Sau khi m畛 t畉p tin v c坦 con tr畛 畉n c畉u tr炭c FILE, c坦 th畛 th畛c hi畛n vi畛c 畛c d畛 li畛u b畉ng nhi畛u hm th動 vi畛n. - V鱈 d畛: int  c; char  buf[200]; c=fgetc(f_read); // 畛c 1 k箪 t畛 ho畉c 動畛c EOF if  (fread(buf, 120, 1, f_read) != 1) { // 畛c 1 kh畛i k箪 t畛 perror(Kh担ng 畛c 動畛c !); } if  (feof(f_read)){ printf(G畉p EOF !); }
5.3.3. Ghi vo t畉p tin - Gi畉 s畛 f_readwrite l con tr畛 畉n c畉u tr炭c FILE 達 動畛c fopen() v畛i ch畉 畛 ghi l w. - V鱈 d畛: int  c; char  buf[201]; // Ghi k箪 t畛 a ra t畉p tin c=a; fputc(f_readwrite); // Ghi m畛t chu畛i k箪 t畛 ra t畉p tin  strcpy(buf, Hello World !); fputs(buf, f_readwrite); // 畉y d畛 li畛u c嘆n l畉i trong v湛ng 畛m ra t畉p tin fflush(f_readwrite);
5.3.4. Di chuy畛n v畛 tr鱈 畛c/ghi trong t畉p tin - D湛ng hm fseek() ph畛i h畛p v畛i ftell(). - V鱈 d畛: fseek(f_read, 20L, SEEK_SET); // Chuy畛n 畉n v畛 tr鱈 20 fseek(f_read, 10L, SEEK_CUR); // i 10 v畛 tr鱈 t鱈nh t畛 v畛 tr鱈 hi畛n th畛i // Ghi nh畛 v畛 tr鱈 hi畛n th畛i. Chuy畛n 畉n v畛 tr鱈 c叩ch cu畛i file 50 byte // Ghi chu畛i Hello World ! k畛 t畛 v畛 tr鱈 坦, sau 坦 v畛 ch畛 c滴 long old_position=ftell(f_readwrite); if  (fseek(f_readwrite, -50L, SEEK_END) < 0){ perror(Kh担ng chuy畛n 畉n 動畛c !); exit(1); } fputs(Hello World !, f_readwrite); fseek(f_readwrite, old_position, SEEK_SET)  ;
5.4. Hm truy xu畉t c畉p th畉p S畛 m担 t畉 (File Descriptor) 動畛c d湛ng 畛 tham chi畉u t畛i t畉p tin. 5.4.1. 畛c/ghi t畉p tin #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> // C叩c bi畉n ch畛a s畛 m担 t畉 t畉p tin tr畉 v畛 b畛i hm open() in t fd_read; in t fd_write; int  fd_readwrite; int  fd_append;
size_t rc; char buf[20]; fd_read=open(/data/vb1.txt, O_RDONLY); rc=read(fd_read, buf, 20); // 畛c 20 bytes if  (rc == 0){ printf(G畉p EOF); } else   if  (rc < 0){ perror(Kh担ng 畛c 動畛c !); exit(1); } else  { printf(畛c 動畛c %d bytes, rc); } close(fd_read);
fd_readwrite=open(/data/food.db, O_RDWR); if  (fd_readwrite < 0){ perror(Kh担ng m畛 動畛c !); exit(1); } rc=write(fd_readwrite,  Hello World !,  strlen(Hello World !)) if  (rc < 0){ perror(Kh担ng ghi 動畛c !); exit(2); } close(fd_readwrite);
5.4.2. Ki畛m tra quy畛n tr棚n t畉p tin Hm  access()   d湛ng ki畛m tra quy畛n truy c畉p t畉p tin: #include <unistd.h> // Ki畛m tra quy畛n 畛c/ghi if  (access(/data/data.db, R_OK | W_OK) == 0) printf(C坦 quy畛n 畛c-Ghi); else printf(Kh担ng c坦 quy畛n 畛c-Ghi);
5.4.3. Thi畉t l畉p quy畛n tr棚n t畉p tin Hm  chmod()  d湛ng 畛  thi畉t l畉p quy畛n truy c畉p t畉p tin: #include <sys/types.h> #include <sys/stat.h> // Cho ph辿p Ch畛 s畛 h畛u quy畛n 畛c-Ghi //  Cho ph辿p Nh坦m 動畛c   畛c, c嘆n nh畛ng ng動畛i Kh叩c 動畛c quy畛n Ghi i f (chmod(/data/data.db, S_IRUSR | S_IWUSR|S_IRGRP|S_IWOTH) == -1){ perror(Kh担ng thi畉t l畉p quy畛n 動畛c !); else printf(Thi畉t l畉p quy畛n 動畛c   );
5.4.4. L畉y th担ng tin v畛 t畉p tin Hm  stat()  d湛ng 畛  l畉y th担ng tin v畛 t畉p tin: #include   <unistd.h> #include <sys/types.h> #include <sys/stat.h> struct stat file_status; i f (stat(/data/data.db, &file_status) == 0){ if  (S_ISDIR(file_status.st_mode)) printf(Th動 m畛c !); if  (S_ISLNK(file_status.st_mode)) printf(Soft Link !); if  (S_ISREG(file_status.st_mode)) printf(Normal File!); } else  perror(Kh担ng x叩c 畛nh 動畛c tr畉ng th叩i !)
5.4.5. 畛i t棚n t畉p tin #include   <stdio.h> if  (rename(/data/data.db, /data/data.bak) == -1){ perror(Kh担ng 畛i t棚n 動畛c !) } 5.4.6. X坦a t畉p tin #include   <unistd.h> if  (unlink(/data/data.db) == -1){ perror(Kh担ng x坦a 動畛c !) }
5.4.7. T畉o li棚n k畉t m畛m #include   <unistd.h> i f (symlink(/data/data.db, /luu/data.lnk) == -1){ perror(Kh担ng t畉o 動畛c li棚n k畉t m畛m !) } 5.4.8. T畉o li棚n k畉t c畛ng #include   <unistd.h> i f (link(/data/data.db, /luu/data.db) == -1){ perror(Kh担ng t畉o 動畛c li棚n k畉t c畛ng !) }
5.5. X畛 l箪 th動 m畛c Linux c坦 c叩c hm ri棚ng d湛ng 畛 x畛 l箪 th動 m畛c: #include <sys/types.h> #include <dirent.h> // M畛 th動 m畛c v畛i k畉t qu畉 l con tr畛 t畛i c畉u tr炭c DIR DIR *opendir(const char * name); // 畛c m畛t 畉u m畛c struct  dirent readdir(DIR *dirp); // 坦ng th動 m畛c int  closedir(DIR *dirp); // V畛 tr鱈 hi畛n hnh c畛a con tr畛 畉u m畛c long int  telldir(DIR *dirp);
// Chuy畛n 畉n 畉u m畛c theo s畛 hi畛u long int seekdir(DIR *dirp, long int loc); // T畉o th動 m畛c #include <sys/types.h> #include <sys/stat.h> int  mkdir(const char *path, mode_t mode); // X坦a th動 m畛c #include   <unistd.h> int  rmdir(const char *path); // Chuy畛n 畛i th動 m畛c lm vi畛c int  chdir(const char *path); // Nh畉n 動畛ng d畉n c畛a th動 m畛c lm vi畛c (hi畛n th畛i) char  *getcwd(char *buff, size_t size);
V鱈 d畛: #include   <unistd.h> #include   <dirent.h> #include <sys/types.h> #include <sys/stat.h> DIR *dp; struct dirent *entry;  struct stat statbuf; if  ((dp = opendir(/data)) == NULL){ perror(Kh担ng m畛 動畛c th動 m畛c); exit(1); } while  ((entry = readdir(dp)) != NULL){ stat(entry->d_name, &statbuf); if  (S_ISDIR(statbuf.st_mode)){ /* L th動 m畛c con */} else  {/* L t畉p tin */}; } closedir(dp);
Ch動董ng 6:  T動董ng t叩c v畛i m担i tr動畛ng Linux Bao g畛m c叩c ph畉n sau: 畛i s畛 truy畛n cho ch動董ng tr狸nh Bi 畉n m担i tr動畛ng Th 畛i gian v ngy th叩ng CITD - VNUHCM
6.1. 畛i s畛 truy畛n cho ch動董ng tr狸nh 6.1.1. Ph但n t鱈ch 畛i s畛 d嘆ng l畛nh Chu董ng tr狸nh ch鱈nh vi畉t b畉ng C c坦 th畛 ch畛a hm main() v畛i 畉c t畉: int  main(int argc, char *argv[]) 畛i s畛 tr棚n d嘆ng l畛nh th動畛ng d湛ng 畛 truy畛n th担ng tin t畛 ngoi vo: # args i  lrv  Hi Linux  f /data/vb.txt Ch動董ng tr狸nh sau in ra t畉t c畉 c叩c gi叩 tr畛 畛i s畛 m hm main() nh畉n 動畛c:
#include <stdio.h> int main(int argc, char *argv[]) { int arg; for(arg = 0; arg < argc; arg++) { if(argv[arg][0] == '-') printf(&quot;option: %s&quot;, argv[arg]+1); else printf(&quot;argument %d: %s&quot;, arg, argv[arg]); } return(0); }
6.1.2. Hm getopt() H畛u 鱈ch cho vi畛c ph但n t鱈ch 畛i s畛 d嘆ng l畛nh. V鱈 d畛: getopt(argc, argv, if:lr); s畉 ph但n t鱈ch v xem i, -l, -r, -f l c叩c t湛y ch畛n, trong 坦 f c坦 d畛 li畛u k竪m theo. #include <stdio.h> #include <unistd.h> int  main(int argc, char *argv[]) {   int  opt;
  while  ((opt = getopt(argc, argv, &quot;if:lr&quot;)) != -1) {   switch (opt) { case  'i': case  'l': case  'r': printf(&quot;option: %c&quot;, opt);   break ;   case  'f': printf(&quot;filename: %s&quot;, optarg);   break ; case  ':': printf(&quot;option needs a value&quot;); break ;
case  '?': printf(&quot;unknown option: %c&quot;, optopt);   break ; } } for  (; optind < argc; optind++) printf(&quot;argument: %s&quot;, argv[optind]);   return (0); }
6.2. Bi畉n m担i tr動畛ng Truy xu畉t v thi畉t l畉p bi畉n m担i tr動畛ng b畉ng c叩c hm: #include <stdlib.h> char *getenv(const char *name); int putenv(const char *string); Trong 坦, name ch畛a t棚n bi畉n m担i tr動畛ng c畉n truy xu畉t, string ch畛a chu畛i theo m畉u: varname=value
6.3. Th畛i gian v ngy th叩ng - L畉y v畛 gi叩 tr畛 th畛i gian 畛 c畉p th畉p (s畛 gi但y k畛 t畛 0 gi畛 1970) b畉ng hm time(): #include <time.h> time_t time(time_t *loc); Trong 坦, loc l tham bi畉n d湛ng nh畉n k畉t qu畉 tr畉 v畛 c畛a hm - So s叩nh gi畛a 2 th畛i i畛m b畉ng hm difftime(): #include <time.h> double difftime(time_t  time1, time_t  time2);
- Hm gmtime() d湛ng truy xu畉t ngy/th叩ng/nm v gi畛 c畛 th畛: #include <time.h> struct tm *gmtime(const time_t timeval); V鱈 d畛: #include <time.h> #include <stdio.h> int  main() {   struct  tm *tm_ptr;   time_t  the_time;
(void) time(&the_time); tm_ptr = gmtime(&the_time); printf(&quot;Raw time is %ld&quot;, the_time); printf(&quot;gmtime gives:&quot;); printf(&quot;date: %02d/%02d/%02d&quot;,    tm_ptr->tm_year, tm_ptr->tm_mon,    tm_ptr->tm_mday); printf(&quot;time: %02d:%02d:%02d&quot;, tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); return (0); }
Ch但n thnh c畉m 董n C叩c anh/ch畛 達 tham d畛 bi gi畉ng. B畛 ph畉n Multi-media 達 h畛 tr畛 ch炭ng t担i trong qu叩 tr狸nh thuy畉t gi畉ng. K畉t th炭c ch動董ng 6 H畉n g畉p l畉i bu畛i h畛c k畉

More Related Content

Linux+03

  • 1. .: CNG NGH畛 LINUX :. M担n h畛c: KHA 3 CH働NG TRNH O T畉O TH畉C S懲 CNTT QUA M畉NG 畉I H畛C QU畛C GIA TP. H畛 CH MINH TR働畛NG 畉I H畛C CNG NGH畛 THNG TIN Gi畉ng vi棚n: TS. T担 Tu畉n (Vi畛n CNTT, BQP) Email: totuan4@yahoo.com Tr畛 l箪 k畛 thu畉t: Nguy畛n V畉n Ph炭c, V滴 M畉nh C動畛ng
  • 2. Ch動董ng 4: Nh畉p m担n l畉p tr狸nh Linux Bao g畛m c叩c ph畉n sau: Linux v Unix C畛ng 畛ng GNU v General Public License L畉p tr狸nh tr棚n Linux Ch動董ng tr狸nh Unix v Linux Ch動董ng tr狸nh Linux 畉u tay helloworld.c T狸m tr畛 gi炭p v畛 tr狸nh bi棚n d畛ch Ph叩t tri畛n ch動董ng tr狸nh v畛i ng担n ng畛 C Th動 vi畛n li棚n k畉t tr棚n Linux CITD - VNUHCM
  • 3. 4.1. Linux v Unix Unix 動畛c 叩nh gi叩 l m畛t HH m畉nh, 畛n 畛nh. Tr動畛c 但y 動畛c xem l m畛t HH m達 ngu畛n m畛 v t畛 khi Sun Microsystems n但ng c畉p l棚n thnh m畛t s畉n ph畉m th動董ng m畉i m畉t d畉n t鱈nh m畛 c畛a HH Unix. C叩c d嘆ng s畉n ph畉m Server c畛a Microsoft 達 v ang c畉nh tranh v畛i c叩c d嘆ng t動董ng 動董ng thu畛c h畛 UNIX (nh動 FreeBSD, Linux, Debian, SCO Unix,) Theo d嘆ng l畛ch s畛 th狸 v畛i vi畛c k畉 th畛a v ph叩t huy nh畛ng t鱈nh nng n畛i b畉t c畛a m畛t HH 達 qua th畛 th叩ch - UNIX { m達 ngu畛n m畛 + t鱈nh 畛n 畛nh } Linux 達 動畛c 畛ng h畛 v 動畛c s畛 d畛ng b畛i c畛ng 畛ng tr棚n ton th畉 gi畛i
  • 4. M畛t s畛 t鱈nh nng kh叩c c畛a HH Linux so v畛i HH Unix : L h畉t nh但n cung c畉p c叩c ch畛c nng c畉n thi畉t t畛i thi畛u c畛a HH t畛a Unix ( Linux gi畛ng Unix g畉n 98% ) L m畛t s畉n ph畉m c坦 gi叩 tr畛 do Unix kh担ng c坦 phi棚n b畉n ch畉y tr棚n h畛 m叩y PC v畛i ki畉n tr炭c Intel
  • 5. Ch動董ng tr狸nh vi畉t tr棚n Unix 畛u c坦 th畛 ch畉y t畛t tr棚n Linux v ng動畛c l畉i Linux 達 動畛c ph叩t tri畛n d畛a tr棚n vi畛c t畉n d畛ng nh畛ng 動u i畛m v kh畉c ph畛c nh畛ng khuy畉t i畛m c畛a c叩c HH t畛a UNIX Linux ngy nay 動畛c s畛 d畛ng r畛ng r達i v ch鱈nh do y畉u t畛 ph畛 bi畉n tr棚n 達 動畛c s畛 h畛 tr畛 gi炭p 畛 c畛a kh叩 nhi畛u c畛ng 畛ng ng動畛i d湛ng tr棚n th畉 gi畛i
  • 6. 4.2. C畛ng 畛ng GNU v General Public License Ngoi HH, c嘆n c坦 c叩c ch動董ng tr狸nh 畛ng d畛ng ph畛c v畛 cho y棚u c畉u c畛a ng動畛i d湛ng C畛ng 畛ng Open Source 達 x但y d畛ng nhi畛u 畛ng d畛ng c坦 kh畉 nng ch畉y 動畛c tr棚n Unix/Linux v nh狸n chung theo xu h動畛ng hi畛n 畉i nh畉m l担i k辿o ng動畛i d湛ng Linux theo ph動董ng ch但m Windows c坦 g狸 ~ Linux c坦 t動董ng 畛ng nh動 v畉y
  • 7. - GNU { G NUs N ot U NIX } GNU theo nguy棚n g畛c ti畉ng Anh l linh d動董ng 畉u b嘆 <=> l bi畛u t動畛ng c畛a t畛 ch畛c c畛ng 畛ng m達 ngu畛n m畛 Tham kh畉o c叩c ph畉n m畛m 畛ng d畛ng mi畛n ph鱈 t畉i 畛a ch畛 http:// www.gnu.org/software/software.html Khi s畛 d畛ng c叩c ph畉n m畛m c畛a t畛 ch畛c GNU th狸 c畉n ph畉i tu但n th畛 m畛t s畛 quy 畛nh c畛a t畛 ch畛c tr棚n Gi畉y ph辿p ch畛ng nh畉n GPL c嘆n g畛i l copyleft thay cho copyright cho c叩c ch畛ng nh畉n b畉n quy畛n th動董ng m畉i
  • 8. M畛t s畛 b畛 c担ng c畛 bi棚n d畛ch C/C++: ngh挑a Tr狸nh bi棚n d畛ch B畛 ph但n t鱈ch t動董ng th鱈ch yacc c畛a UNIX Bison H畛 v畛 Shell h畛 tr畛 c董 ch畉 d嘆ng l畛nh bash Tr狸nh so畉n th畉o vn b畉n GNU Emacs Tr狸nh qu畉n l箪 m達 ngu畛n v qu畉n l箪 th動 vi畛n GNU make Tr狸nh g畛 l畛i gdb Tr狸nh bi棚n d畛ch C++ g++ Tr狸nh bi棚n d畛ch C gcc
  • 9. 4.3. L畉p tr狸nh tr棚n Linux Nguy棚n th畛y Unix 動畛c vi畉t b畉ng C v ph畉n l畛n c叩c 畛ng d畛ng tr棚n Unix 動畛c vi畉t b畉ng C Ngoi C l l畛a ch畛n duy nh畉t, c坦 th畛 s畛 d畛ng Pascal, Assembly ho畉c Perl 畛 x但y d畛ng c叩c ch動董ng tr狸nh cho Linux UNIX Bourne Shell Tcl / Tk SQL Smalltalk Scheme Python Prolog PostScript Perl Pascal Objective C Oberon Modula 3 Modula 2 Lisp JavaScript Java Icon Fortran Forth Eiffel C++ C Ada
  • 10. 4.4. Ch動董ng tr狸nh Unix v Linux Ch動董ng tr狸nh tr棚n Unix v Linux t畛n t畉i 畛 hai d畉ng: D畉ng th畛c thi (t畉p tin nh畛 ph但n) D畉ng th担ng d畛ch (t畉p tin script) File ch動董ng tr狸nh th畛c thi ~ nh動 t畉p tin .exe c畛a MS-DOS/Windows File script l nh畛ng ch畛 th畛 l畛nh 動畛c th畛c thi b畛i shell hay tr狸nh th担ng d畛ch no 坦 (Perl, Python, Tcl, ...) t動董ng t畛 nh動 c叩c t畉p tin .bat c畛a MS-DOS, VBScript v JavaScript c畛a Windows Script Host - C叩c file script v ch動董ng tr狸nh nh畛 ph但n 畛u c坦 kh畉 nng v m畉nh ngang nhau Do v畉y, l炭c th畛c thi kh坦 ph但n bi畛t 動畛c 但u l l畛nh g畛i ch動董ng tr狸nh nh畛 ph但n v 但u l l畛nh th畛c hi畛n script - Khi ch動董ng tr狸nh 動畛c g畛i, Linux s畉 t狸m 動畛ng d畉n 畉n n董i ch畛a t畉p tin ch動董ng tr狸nh trong bi畉n m担i tr動畛ng PATH . Th担ng th動畛ng, bi畉n ny ch畛a c叩c 動畛ng d畉n sau /bin , /user/bin , /usr/local/bin
  • 11. - 畛i v畛i ng動畛i qu畉n tr畛 h畛 th畛ng, c坦 th棚m m畛t s畛 動畛ng d畉n tr畛 畉n th動 m畛c /sbin , /usr/sbin - Unix/Linux s畛 d畛ng d畉u : 畛 ph但n c叩ch c叩c 動畛ng d畉n trong bi畉n m担i tr動畛ng PATH , trong khi MS-DOS d湛ng d畉u ; - V鱈 d畛: PATH = /bin: /user/bin: /usr/local/bin:.:
  • 12. 4.5. Ch動董ng tr狸nh Linux 畉u tay ( Helloworld.c ) D湛ng tr狸nh so畉n th畉o b畉t k畛 (trong Console Mode) 畛 so畉n th畉o source code nh動: vi cat D湛ng ch畛c nng Edit trong mc (Midnight Commander) v.v... - C叩ch s畛 d畛ng: vi helloworld.c cat > helloworld.c - M畛t giao di畛n kh叩c t動董ng t畛 nh動 trong Turbo C c畛a Borland th狸 s畛 d畛ng tr狸nh so畉n th畉o wpe (cho ph辿p k畉t h畛p ch畛c nng bi棚n d畛ch c畛a cc, gcc, pascal ) - Tham kh畉o V鱈 d畛 4-1 : helloworld.c
  • 13. Windows Programming Environment (WPE) == ----- ----- == H狸nh 4.1 Tr狸nh wpe trong ch畉 畛 Console
  • 14. Windows Programming Environment (WPE) == ----- ----- == H狸nh 4.2 Tr狸nh wpe trong ch畉 畛 X-Windows
  • 15. - S畛 d畛ng gcc (ho畉c cc ) 畛 bi棚n d畛ch nh動 sau: # gcc helloworld.c -o helloworld # ./helloworld Hello World #
  • 16. 4.6. T狸m tr畛 gi炭p v畛 tr狸nh bi棚n d畛ch Trong tr狸nh gcc c坦 r畉t 鱈t t湛y ch畛n (-o, -g, -l, -I, v.v...). S畛 d畛ng l畛nh man 畛 tham kh畉o th棚m m畛t s畛 tu畛 ch畛n kh叩c. Trong b畛 ch動董ng tr狸nh GNU c滴ng k竪m theo ch動董ng tr狸nh info c坦 動u i畛m l h動畛ng d畉n s畛 d畛ng ph畉n m畛m r畉t chi ti畉t. C叩ch th畛c d湛ng l畛nh info nh動 man.
  • 17. 4.7. Ph叩t tri畛n ch動董ng tr狸nh v畛i ng担n ng畛 C S畛 d畛ng ng担n ng畛 C lm ng担n ng畛 ch鱈nh trong ch動董ng tr狸nh Ng担n ng畛 l畉p tr狸nh C kh担ng ph畛 thu畛c vo HH no 4.7.1. Ch動董ng tr狸nh tr棚n Linux C畉n n畉m r探 v畛 tr鱈 畉t ti nguy棚n 畛 x但y d畛ng ch動董ng tr狸nh nh動 tr狸nh bi棚n d畛ch, file th動 vi畛n, c叩c file header khai b叩o hm v c畉u tr炭c d畛 li畛u, ... Tr狸nh bi棚n d畛ch gcc th動畛ng 動畛c 畉t trong /usr/bin ho畉c usr/local/bin . Khi bi棚n d畛ch, gcc c畉n nhi畛u file h畛 tr畛 nh動 c叩c t畉p tin th動 vi畛n li棚n k畉t (trong /lib ho畉c /usr/local/lib ), c叩c file C header (trong /usr/include ho畉c /usr/local/include ), v.v... Ch動董ng tr狸nh sau khi bi棚n d畛ch c坦 th畛 畉t b畉t k畛 但u tr棚n h畛 th畛ng mi畛n l HH c坦 th畛 t狸m th畉y trong bi畉n m担i tr動畛ng PATH ho畉c theo 動畛ng d畉n tuy畛t 畛i trong d嘆ng l畛nh.
  • 18. 4.7.2. C叩c file header File header trong C ch畛a 畛nh ngh挑a c叩c hm, c叩c h畉ng c湛ng v畛i nh畛ng c畉u tr炭c d畛 li畛u c畉n cho qu叩 tr狸nh bi棚n d畛ch V鱈 d畛 m畛t khai b叩o header trong C: #include <sys/types.h> - Tr狸nh bi棚n d畛ch s畉 t狸m file header c坦 t棚n l types.h trong th動 m畛c /usr/include/sys - 畛i v畛i c叩c hm l畉p tr狸nh 畛 ho畉 X-Window, c叩c file header n畉m trong th動 m畛c /usr/include/X11 - S畛 d畛ng t湛y ch畛n -I 畛 ch畛 ra th動 m畛c ch畛a c叩c file header c畛a ri棚ng m狸nh (kh叩c v畛i th動 m畛c m畉c 畛nh c畛a h畛 th畛ng). - V鱈 d畛: # gcc I /usr/mypro/include test.c -o test - Xem th担ng tin v畛 c叩c hm trong th動 vi畛n # man <function name>
  • 19. 4.7.3. C叩c file th動 vi畛n 畛 t畉o ra ch動董ng tr狸nh th畛c thi, c畉n c坦 c叩c file th動 vi畛n Trong Linux, c叩c file th動 vi畛n th動畛ng l .a , .so , . sa v 動畛c b畉t 畉u b畉ng ti畉p 畉u ng畛 lib . V鱈 d畛: libutil.a ho畉c libc.so 但y l t棚n c叩c th動 vi畛n trong Linux - C坦 2 lo畉i th動 vi畛n li棚n k畉t: Li棚n k畉t 畛ng (Dynamic) Li棚n k畉t t挑nh (Static) - Khi bi棚n d畛ch, th担ng th動畛ng ch動董ng tr狸nh li棚n k畉t ( ld ) s畉 t狸m th動 vi畛n trong 2 th動 m畛c chu畉n /usr/lib v /lib
  • 20. 4.8. Th動 vi畛n li棚n k畉t tr棚n Linux H狸nh th畛c 董n gi畉n nh畉t c畛a th動 vi畛n l t畉p h畛p c叩c file 畛i t動畛ng .o do tr狸nh bi棚n d畛ch t畉o ta 畛 b動畛c bi棚n d畛ch v畛i t湛y ch畛n -c #gcc -c helloworld.c - L炭c ny tr狸nh bi棚n d畛ch ch動a t畉o ra file th畛c thi m t畉o ra file 畛i t動畛ng helloworld.o (file ny ch畛a m達 m叩y c畛a ch動董ng tr狸nh 達 動畛c t畛 ch畛c l畉i ~ c叩c file .o ny t動董ng t畛 nh動 c叩c file .obj do tr狸nh bi棚n d畛ch C sinh ra tr棚n DOS ho畉c Windows) - 畛 t畉o ra file th畛c thi, th畛c hi畛n b動畛c cu畛i c湛ng (g畛i linker ld ) # gcc helloworld.o -o helloworld - N畉u kh担ng d湛ng kho叩 chuy畛n -c th狸 tr狸nh bi棚n d畛ch s畉 th畛c hi畛n c畉 hai b動畛c tr棚n 畛ng th畛i.
  • 21. 4.8.1. Th動 vi畛n li棚n k畉t t挑nh L c叩c th動 vi畛n khi li棚n k畉t tr狸nh bi棚n d畛ch s畉 l畉y ton b畛 m達 th畛c thi c畛a hm trong th動 vi畛n 動a vo ch動董ng tr狸nh ch鱈nh. Ch動董ng tr狸nh s畛 d畛ng th動 vi畛n li棚n k畉t t挑nh ny ch畉y 畛c l畉p v畛i th動 vi畛n sau khi bi棚n d畛ch. Do 坦 khi c畉n s畛a ch畛a ho畉c n但ng c畉p Bi棚n d畛ch l畉i Tham kh畉o V鱈 d畛 4-2: fred.c Tham kh畉o V鱈 d畛 4-3: bill.c Ti畉n hnh bi棚n d畛ch 畛 t畉o ta 2 file 畛i t動畛ng .o #gcc -c fred.c bill.c T畉o file ti棚u 畛 畛 khai b叩o c叩c hm nguy棚n m畉u c畛a ng動畛i s畛 d畛ng Tham kh畉o V鱈 d畛 4-4: lib.h - Ch動董ng tr狸nh ch鱈nh tri畛u g畛i 2 hm tr棚n: V鱈 d畛 4-5: program.c
  • 22. Sau khi bi棚n d畛ch thnh c叩c t畉p tin .o, c畉n t畉o t畉p tin th畛c thi nh動 sau: # gcc program.o bill.o fred.o o program C叩ch t畉o th動 vi畛n li棚n k畉t t挑nh: # ar cvr libfoo.a bill.o fred.o Bi棚n d畛ch v h畛p nh畉t v畛i th動 vi畛n li棚n k畉t t挑nh: # gcc program.c o program L. -lfoo
  • 23. 4.8.2. Th動 vi畛n li棚n k畉t 畛ng 4.8.2.1. T畉o v s畛 d畛ng th動 vi畛n li棚n k畉t 畛ng .so Th動 vi畛n li棚n k畉t t挑nh c坦 nh動畛c i畛m: Ph畉i nh炭ng m達 nh畛 ph但n k竪m theo ch動董ng tr狸nh khi li棚n k畉t, d畉n 畉n t狸nh tr畉ng t畛n kh担ng gian 挑a n畉u nh動 c坦 ch動董ng tr狸nh y棚u c畉u s畛 d畛ng m畛t hm nhi畛u l畉n (v鱈 d畛 nh動 hm printf() ) Ph畉i bi棚n d畛ch v/ho畉c li棚n k畉t l畉i khi mu畛n n但ng c畉p (ho畉c b畛 sung t鱈nh nng m畛i) - Th動 vi畛n li棚n k畉t 畛ng kh畉c ph畛c 動畛c hai v畉n 畛 tr棚n do c叩c hm th動 vi畛n li棚n k畉t 畛ng 動畛c n畉p trong th畛i gian thi hnh v c坦 th畛 動畛c d湛ng chung gi畛a nhi畛u ti畉n tr狸nh. 畛 動a hm vo th動 vi畛n li棚n k畉t 畛ng c畉n d湛ng t湛y ch畛n -fpic (ho畉c fPIC), vi畉t t畉t c畛a Position Independence Code
  • 24. - V鱈 d畛 sau s畉 bi棚n d畛ch fred.c v bill.c thnh c叩c t畉p tin .o c坦 kh畉 nng 動a 動畛c vo th動 vi畛n li棚n k畉t 畛ng: # gcc -c -fpic fred.c bill.c - Ti畉p 畉n t畉o th動 vi畛n li棚n k畉t 畛ng t畛 c叩c file 畛i t動畛ng .o tr棚n b畉ng c叩ch s畛 d畛ng t湛y ch畛n -shared (do th動 vi畛n li棚n k畉t 畛ng 動畛c t畉o ph畛 thu畛c vo ki畉n tr炭c c畛a HH): # gcc -shared bill.o fred.o -o libfoo.so - C叩ch s畛 d畛ng th動 vi畛n li棚n k畉t 畛ng v畛i ch動董ng tr狸nh ch鱈nh: # gcc program.c -o program -L. -lfoo - V畛i c叩c tu畛 ch畛n -L. v -lfoo tr狸nh bi棚n d畛ch v li棚n k畉t gcc s畉 t狸m th動 vi畛n libfoo.so ho畉c libfoo.a trong th動 m畛c hi畛n hnh v t畉o ra file th畛c thi program. - Th動 vi畛n .so 動畛c 動u ti棚n s畛 d畛ng so v畛i .a . N畉u kh担ng t狸m th畉y file th動 vi畛n .so tr棚n th狸 .a m畛i 動畛c xem x辿t 畉n.
  • 25. V鱈 d畛 minh h畛a v畛 th動 vi畛n li棚n k畉t tr棚n Windows == ----- ----- ==
  • 26. 4.8.2.2. Th畛c thi g畛i li棚n k畉t mu畛n Th動 vi畛n li棚n k畉t 畛ng ph畉i n畉m trong /lib, /usr/lib, /usr/local/lib ho畉c th動 m畛c v畛i 動畛ng d畉n ch畛 b畛i bi畉n m担i tr動畛ng LD_LIBRARY_PATH V鱈 d畛: # export LD_LIBRARY_PATH=/myprog/lib:/other/lib:. # ./program C坦 th畛 ch畛 畛ng g畛i v n畉p c叩c hm th動 vi畛n li棚n k畉t 畛ng m kh担ng c畉n nh畛 vo HH. 但y 動畛c g畛i l hm li棚n k畉t mu畛n Ba hm li棚n k畉t mu畛n ch鱈nh l: dlopen() dlsym() dlclose()
  • 27. - C叩c hm tr棚n 動畛c khai b叩o nh動 sau: #include <dlfcn.h> void *dlopen (const char* lib_file, int mode); void *dlsym (void * handle, const char* funct_name); int dlclose (void *handle); - Hm dlopen() y棚u c畉u 動畛ng d畉n lib_file t畛i th動 vi畛n .so c畉n n畉p. - Hm dlsym() y棚u c畉u con tr畛 畉n th動 vi畛n n畉p v tr畉 v畛 tr動畛c 坦 b畛i hm dlopen() - Hm dlclose() gi畉i ph坦ng th動 vi畛n tr畛 畉n b畛i handle do dlopen() n畉p tr動畛c 坦 - Tham kh畉o V鱈 d畛 4-6: program2.c
  • 28. Ch但n thnh c畉m 董n C叩c anh/ch畛 達 tham d畛 bi gi畉ng. B畛 ph畉n Multi-media 達 h畛 tr畛 ch炭ng t担i trong qu叩 tr狸nh thuy畉t gi畉ng. K畉t th炭c ch動董ng 4 H畉n g畉p l畉i bu畛i h畛c k畉
  • 29. Ch動董ng 5: X畛 l箪 t畉p tin v th動 m畛c Bao g畛m c叩c ph畉n sau: H畛 th畛ng t 畉p tin trong Linux C叩c c叩ch x畛 l箪 t畉p tin trong Linux Th動 vi畛n xu畉t nh畉p chu畉n (Standard I/O Library) Hm truy xu畉t c畉p th畉p X畛 l箪 th動 m畛c CITD - VNUHCM
  • 30. 5.1. H畛 th畛ng t畉p tin trong Linux T畉t c畉 c叩c t畉p tin v th動 m畛c 動畛c t畛 ch畛c theo d畉ng c但y duy nh畉t G畛c c畛a c但y th動 m畛c g畛i l root v 動畛c k箪 hi畛u l / Cho d湛 m叩y t鱈nh c坦 nhi畛u 畛 挑a (ho畉c nhi畛u ph但n v湛ng, nhi畛u thi畉t b畛) t畉t c畉 動畛c k畉t g叩n vo c叩c nh叩nh c畛a c但y th動 m畛c ch鱈nh Thao t叩c k畉t g叩n 動畛c th畛c hi畛n b畛i l畛nh mount H狸nh 5-1 cho th畉y th動 m畛c /home/soft l th動 m畛c 動畛c g叩n k畉t v畛i m畛t ph但n v湛ng c畛a 挑a c畛ng th畛 2
  • 31. - Th畛c t畉, th動 m畛c trong Linux 動畛c xem nh動 m畛t t畉p tin c坦 thu畛c t鱈nh d . H狸nh 5.1 H畛 th畛ng th動 m畛c trong Linux 挑a c畛ng 1 挑a c畛ng 2 usr etc home dev minhkhai soft book.doc office helps.txt
  • 32. H狸nh 5.1.a M畛t c畉u tr炭c th動 m畛c trong Linux
  • 33. 5.2. C叩c c叩ch x畛 l箪 t畉p tin trong Linux C坦 hai c叩ch truy xu畉t file: Truy xu畉t file s畛 d畛ng v湛ng 畛m (stream file): D畛a vo c叩c hm th動 vi畛n chu畉n stdio Truy xu畉t file c畉p th畉p (low-level): D畛a vo c叩c l畛i g畛i h畛 th畛ng - H狸nh 5.2 l m担 h狸nh truy xu畉t ph畉n c畛ng d畛a vo th動 vi畛n chu畉n v c叩c l畛i g畛i h畛 th畛ng.
  • 34. H狸nh 5.2 C叩ch tri畛u g畛i v truy xu畉t thi畉t b畛 ph畉n c畛ng 畛ng d畛ng (Application) stdio Library L畛i g畛i h畛 th畛ng (System Call) KERNEL Device Drivers Thi畉t b畛 ph畉n c畛ng (Hardware Devices) g畛i hm Kh担ng gian ng動畛i d湛ng (User Space) Kh担ng gian h畛 th畛ng (Kernel Space)
  • 35. 5.3. Th動 vi畛n xu畉t nh畉p chu畉n (Standard I/O Library) 動畛c khai b叩o trong stdio.h Th動 vi畛n ny tu但n theo chu畉n ANSI c坦 th畛 s畛 d畛ng ch炭ng h畉u nh動 tr棚n c叩c HH. fopen(), fclose() fread(), fwrite() fflush() fseek() v.v... - T畉t c畉 c叩c hm tr棚n 畛u s畛 d畛ng con tr畛 t畛i c畉u tr炭c FILE 5.3. Th動 vi畛n xu畉t nh畉p chu畉n (Standard I/O Library) 動畛c khai b叩o trong stdio.h Th動 vi畛n ny tu但n theo chu畉n ANSI c坦 th畛 s畛 d畛ng ch炭ng h畉u nh動 tr棚n c叩c HH kh叩c nhau: fopen(), fclose() fread(), fwrite() fflush() fseek() v.v... - T畉t c畉 c叩c hm tr棚n 畛u s畛 d畛ng con tr畛 t畛i c畉u tr炭c FILE
  • 36. 5.3.1. 坦ng m畛 t畉p tin - S畛 d畛ng hm fopen() v fclose() - V鱈 d畛: /*Khai b 叩 o c 叩c b i畉 n con tr 畛 t 畛i c 畉 u tr 炭 c FILE*/ FILE * f_read; FILE * f_write; FILE * f_readwrite; FILE * f_append; /*M 畛 t 畉p tin data.txt 畛 畛 c*/ f_read=fopen(/home/ch12/data.txt, r); if (!f_read) { /*Kh 担 ng m 畛 動畛 c t 畉p tin */ perror(Khong mo duoc file de doc...); exit (1); }
  • 37. /* M 畛 t 畉p tin logfile trong th 動 m 畛 c hi 畛n h nh 畛 ghi. N 畉 u ch 動a c坦, t 畉p tin m畛i 動畛c t畉o; N 畉 u 達 c坦, n 畛i dung c滴 b畛 x坦a */ f_write=fopen(logfile.txt, w); /* M 畛 /usr/local/db/users 畛 畛c v ghi */ f_readwrite=fopen(/usr/local/db/users, rw); /* M 畛 /var/adm/messages 畛 n畛i th棚m d畛 li畛u vo cu畛i */ f_append=fopen(/var/adm/messages, a); /* 坦ng t畉p tin ang m畛 */ if (!fclose(f_readwrite)) { perror(Khong the dong file duoc...); exit (1); }
  • 38. 5.3.2. 畛c t畛 t畉p tin - Sau khi m畛 t畉p tin v c坦 con tr畛 畉n c畉u tr炭c FILE, c坦 th畛 th畛c hi畛n vi畛c 畛c d畛 li畛u b畉ng nhi畛u hm th動 vi畛n. - V鱈 d畛: int c; char buf[200]; c=fgetc(f_read); // 畛c 1 k箪 t畛 ho畉c 動畛c EOF if (fread(buf, 120, 1, f_read) != 1) { // 畛c 1 kh畛i k箪 t畛 perror(Kh担ng 畛c 動畛c !); } if (feof(f_read)){ printf(G畉p EOF !); }
  • 39. 5.3.3. Ghi vo t畉p tin - Gi畉 s畛 f_readwrite l con tr畛 畉n c畉u tr炭c FILE 達 動畛c fopen() v畛i ch畉 畛 ghi l w. - V鱈 d畛: int c; char buf[201]; // Ghi k箪 t畛 a ra t畉p tin c=a; fputc(f_readwrite); // Ghi m畛t chu畛i k箪 t畛 ra t畉p tin strcpy(buf, Hello World !); fputs(buf, f_readwrite); // 畉y d畛 li畛u c嘆n l畉i trong v湛ng 畛m ra t畉p tin fflush(f_readwrite);
  • 40. 5.3.4. Di chuy畛n v畛 tr鱈 畛c/ghi trong t畉p tin - D湛ng hm fseek() ph畛i h畛p v畛i ftell(). - V鱈 d畛: fseek(f_read, 20L, SEEK_SET); // Chuy畛n 畉n v畛 tr鱈 20 fseek(f_read, 10L, SEEK_CUR); // i 10 v畛 tr鱈 t鱈nh t畛 v畛 tr鱈 hi畛n th畛i // Ghi nh畛 v畛 tr鱈 hi畛n th畛i. Chuy畛n 畉n v畛 tr鱈 c叩ch cu畛i file 50 byte // Ghi chu畛i Hello World ! k畛 t畛 v畛 tr鱈 坦, sau 坦 v畛 ch畛 c滴 long old_position=ftell(f_readwrite); if (fseek(f_readwrite, -50L, SEEK_END) < 0){ perror(Kh担ng chuy畛n 畉n 動畛c !); exit(1); } fputs(Hello World !, f_readwrite); fseek(f_readwrite, old_position, SEEK_SET) ;
  • 41. 5.4. Hm truy xu畉t c畉p th畉p S畛 m担 t畉 (File Descriptor) 動畛c d湛ng 畛 tham chi畉u t畛i t畉p tin. 5.4.1. 畛c/ghi t畉p tin #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> // C叩c bi畉n ch畛a s畛 m担 t畉 t畉p tin tr畉 v畛 b畛i hm open() in t fd_read; in t fd_write; int fd_readwrite; int fd_append;
  • 42. size_t rc; char buf[20]; fd_read=open(/data/vb1.txt, O_RDONLY); rc=read(fd_read, buf, 20); // 畛c 20 bytes if (rc == 0){ printf(G畉p EOF); } else if (rc < 0){ perror(Kh担ng 畛c 動畛c !); exit(1); } else { printf(畛c 動畛c %d bytes, rc); } close(fd_read);
  • 43. fd_readwrite=open(/data/food.db, O_RDWR); if (fd_readwrite < 0){ perror(Kh担ng m畛 動畛c !); exit(1); } rc=write(fd_readwrite, Hello World !, strlen(Hello World !)) if (rc < 0){ perror(Kh担ng ghi 動畛c !); exit(2); } close(fd_readwrite);
  • 44. 5.4.2. Ki畛m tra quy畛n tr棚n t畉p tin Hm access() d湛ng ki畛m tra quy畛n truy c畉p t畉p tin: #include <unistd.h> // Ki畛m tra quy畛n 畛c/ghi if (access(/data/data.db, R_OK | W_OK) == 0) printf(C坦 quy畛n 畛c-Ghi); else printf(Kh担ng c坦 quy畛n 畛c-Ghi);
  • 45. 5.4.3. Thi畉t l畉p quy畛n tr棚n t畉p tin Hm chmod() d湛ng 畛 thi畉t l畉p quy畛n truy c畉p t畉p tin: #include <sys/types.h> #include <sys/stat.h> // Cho ph辿p Ch畛 s畛 h畛u quy畛n 畛c-Ghi // Cho ph辿p Nh坦m 動畛c 畛c, c嘆n nh畛ng ng動畛i Kh叩c 動畛c quy畛n Ghi i f (chmod(/data/data.db, S_IRUSR | S_IWUSR|S_IRGRP|S_IWOTH) == -1){ perror(Kh担ng thi畉t l畉p quy畛n 動畛c !); else printf(Thi畉t l畉p quy畛n 動畛c );
  • 46. 5.4.4. L畉y th担ng tin v畛 t畉p tin Hm stat() d湛ng 畛 l畉y th担ng tin v畛 t畉p tin: #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> struct stat file_status; i f (stat(/data/data.db, &file_status) == 0){ if (S_ISDIR(file_status.st_mode)) printf(Th動 m畛c !); if (S_ISLNK(file_status.st_mode)) printf(Soft Link !); if (S_ISREG(file_status.st_mode)) printf(Normal File!); } else perror(Kh担ng x叩c 畛nh 動畛c tr畉ng th叩i !)
  • 47. 5.4.5. 畛i t棚n t畉p tin #include <stdio.h> if (rename(/data/data.db, /data/data.bak) == -1){ perror(Kh担ng 畛i t棚n 動畛c !) } 5.4.6. X坦a t畉p tin #include <unistd.h> if (unlink(/data/data.db) == -1){ perror(Kh担ng x坦a 動畛c !) }
  • 48. 5.4.7. T畉o li棚n k畉t m畛m #include <unistd.h> i f (symlink(/data/data.db, /luu/data.lnk) == -1){ perror(Kh担ng t畉o 動畛c li棚n k畉t m畛m !) } 5.4.8. T畉o li棚n k畉t c畛ng #include <unistd.h> i f (link(/data/data.db, /luu/data.db) == -1){ perror(Kh担ng t畉o 動畛c li棚n k畉t c畛ng !) }
  • 49. 5.5. X畛 l箪 th動 m畛c Linux c坦 c叩c hm ri棚ng d湛ng 畛 x畛 l箪 th動 m畛c: #include <sys/types.h> #include <dirent.h> // M畛 th動 m畛c v畛i k畉t qu畉 l con tr畛 t畛i c畉u tr炭c DIR DIR *opendir(const char * name); // 畛c m畛t 畉u m畛c struct dirent readdir(DIR *dirp); // 坦ng th動 m畛c int closedir(DIR *dirp); // V畛 tr鱈 hi畛n hnh c畛a con tr畛 畉u m畛c long int telldir(DIR *dirp);
  • 50. // Chuy畛n 畉n 畉u m畛c theo s畛 hi畛u long int seekdir(DIR *dirp, long int loc); // T畉o th動 m畛c #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *path, mode_t mode); // X坦a th動 m畛c #include <unistd.h> int rmdir(const char *path); // Chuy畛n 畛i th動 m畛c lm vi畛c int chdir(const char *path); // Nh畉n 動畛ng d畉n c畛a th動 m畛c lm vi畛c (hi畛n th畛i) char *getcwd(char *buff, size_t size);
  • 51. V鱈 d畛: #include <unistd.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> DIR *dp; struct dirent *entry; struct stat statbuf; if ((dp = opendir(/data)) == NULL){ perror(Kh担ng m畛 動畛c th動 m畛c); exit(1); } while ((entry = readdir(dp)) != NULL){ stat(entry->d_name, &statbuf); if (S_ISDIR(statbuf.st_mode)){ /* L th動 m畛c con */} else {/* L t畉p tin */}; } closedir(dp);
  • 52. Ch動董ng 6: T動董ng t叩c v畛i m担i tr動畛ng Linux Bao g畛m c叩c ph畉n sau: 畛i s畛 truy畛n cho ch動董ng tr狸nh Bi 畉n m担i tr動畛ng Th 畛i gian v ngy th叩ng CITD - VNUHCM
  • 53. 6.1. 畛i s畛 truy畛n cho ch動董ng tr狸nh 6.1.1. Ph但n t鱈ch 畛i s畛 d嘆ng l畛nh Chu董ng tr狸nh ch鱈nh vi畉t b畉ng C c坦 th畛 ch畛a hm main() v畛i 畉c t畉: int main(int argc, char *argv[]) 畛i s畛 tr棚n d嘆ng l畛nh th動畛ng d湛ng 畛 truy畛n th担ng tin t畛 ngoi vo: # args i lrv Hi Linux f /data/vb.txt Ch動董ng tr狸nh sau in ra t畉t c畉 c叩c gi叩 tr畛 畛i s畛 m hm main() nh畉n 動畛c:
  • 54. #include <stdio.h> int main(int argc, char *argv[]) { int arg; for(arg = 0; arg < argc; arg++) { if(argv[arg][0] == '-') printf(&quot;option: %s&quot;, argv[arg]+1); else printf(&quot;argument %d: %s&quot;, arg, argv[arg]); } return(0); }
  • 55. 6.1.2. Hm getopt() H畛u 鱈ch cho vi畛c ph但n t鱈ch 畛i s畛 d嘆ng l畛nh. V鱈 d畛: getopt(argc, argv, if:lr); s畉 ph但n t鱈ch v xem i, -l, -r, -f l c叩c t湛y ch畛n, trong 坦 f c坦 d畛 li畛u k竪m theo. #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { int opt;
  • 56. while ((opt = getopt(argc, argv, &quot;if:lr&quot;)) != -1) { switch (opt) { case 'i': case 'l': case 'r': printf(&quot;option: %c&quot;, opt); break ; case 'f': printf(&quot;filename: %s&quot;, optarg); break ; case ':': printf(&quot;option needs a value&quot;); break ;
  • 57. case '?': printf(&quot;unknown option: %c&quot;, optopt); break ; } } for (; optind < argc; optind++) printf(&quot;argument: %s&quot;, argv[optind]); return (0); }
  • 58. 6.2. Bi畉n m担i tr動畛ng Truy xu畉t v thi畉t l畉p bi畉n m担i tr動畛ng b畉ng c叩c hm: #include <stdlib.h> char *getenv(const char *name); int putenv(const char *string); Trong 坦, name ch畛a t棚n bi畉n m担i tr動畛ng c畉n truy xu畉t, string ch畛a chu畛i theo m畉u: varname=value
  • 59. 6.3. Th畛i gian v ngy th叩ng - L畉y v畛 gi叩 tr畛 th畛i gian 畛 c畉p th畉p (s畛 gi但y k畛 t畛 0 gi畛 1970) b畉ng hm time(): #include <time.h> time_t time(time_t *loc); Trong 坦, loc l tham bi畉n d湛ng nh畉n k畉t qu畉 tr畉 v畛 c畛a hm - So s叩nh gi畛a 2 th畛i i畛m b畉ng hm difftime(): #include <time.h> double difftime(time_t time1, time_t time2);
  • 60. - Hm gmtime() d湛ng truy xu畉t ngy/th叩ng/nm v gi畛 c畛 th畛: #include <time.h> struct tm *gmtime(const time_t timeval); V鱈 d畛: #include <time.h> #include <stdio.h> int main() { struct tm *tm_ptr; time_t the_time;
  • 61. (void) time(&the_time); tm_ptr = gmtime(&the_time); printf(&quot;Raw time is %ld&quot;, the_time); printf(&quot;gmtime gives:&quot;); printf(&quot;date: %02d/%02d/%02d&quot;, tm_ptr->tm_year, tm_ptr->tm_mon, tm_ptr->tm_mday); printf(&quot;time: %02d:%02d:%02d&quot;, tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); return (0); }
  • 62. Ch但n thnh c畉m 董n C叩c anh/ch畛 達 tham d畛 bi gi畉ng. B畛 ph畉n Multi-media 達 h畛 tr畛 ch炭ng t担i trong qu叩 tr狸nh thuy畉t gi畉ng. K畉t th炭c ch動董ng 6 H畉n g畉p l畉i bu畛i h畛c k畉