Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
70,5 KB
Nội dung
1. Khái quát !" #$%&'()"'*+$,(-".% /0*112&#$%- ".%.3045& )645'()"'78.%91:6;<=>?7 9@94954A(68&=8.%#3"06 4BC'()"'&#$%D.C@E71F- DE08".%;<G4(045& =8(H.(A:-.304"@( GI8$.#J#!600*7#5K0/*@*27 081L(/127M=D#3N$..0A.%/O>=P O*>*11=2&)645.%7D1F%877 @Q.%7 -.%4.08.%45& RS@HT@UG#!.%#G4(-& VG#G#!$(7G#!(.%-AK W0&X.%D0GC8GN41Y 1#!I";<=>?8.%8CKZ!7( 6-AE&[..%D#3S@HG674\4S +7--*8.%8(6L084\/12 '()"'& )]^.%JH",(-A G]_7-.01AF7-T8G16G`*#3 C9.%4(-]@>Oa/>*11O@*`2@K (64!.%& [#DK7.%G0#$%/GD #$%$_E.%@K84U7#! 30%D-*.%4#$%2&bK".% -HA98459'()"'79#!@9 c "#!@908&dL@U1*1.%- H(10&eS170.%-8( 8& X7.%#3K0G]_50fghe&a( .%GN4K#3C8.%8&'.% 8GS0.&XA7.D61:@ (.%7-K0D49G]_ "& 2. Cách hoạt động của tiến trình Vc#$%Q@B(7D-K0L=ij @9#$%4#-40L#!/@2&X.% -88J irunning JSD.%.I";<=>?@9L8H8 G4(%& iwaiting J.%]'()"'#5I";<=>?74!.#3K008 8& isuspend J'()"'@Q.%&X.%#3#48 /1**02&VE.4-E7'()"'1F8T/k*020 ,(.%45&=K008A=>?.%.0U & XA@B(74 l @9(=ij7D-1;@U(# .%40L#!&=Dm-AEc.% "nD080o& dL@UJp1Pbo (`1F*.%C4"#A0L#5&XH.D 04(64#$8A@B(7mDDC .%1*1&VN(-^DAE1A .%H8&d"0%7D-@9(`/2 q S.%5Q.%m&'@9(11*/2(N. %'()"'&'**/2m-.%58& 3. Cấu trúc tiến trình =D*'()"'I<.%#.r [.-#!@9J1*c41*q904#$%*0 !7H.7'()"'1FI<40,#$%*04 49584N+0S49#4.%&'%1K8 0S#$%*0.%#!81;@U X%71*c#$%*0%+0`*c& p*0`*c 1*q#$%*04%+@*0`*q& p*0@*`*q =DEE5#!@91*c41*q-C8L8 0484N*0 !&'%A( G5'()"'#$%*00U4U#!@9& [.@9(017(61F(ADG4"8.%'( )"'187 dL@UJp01P` +.%#38]@@N>Oa/0*11 @*`2&>Oa#!16A@#$-8]Qqstquvw&V.%5 AEC7'()"'1FNK16/#].% .216AA4K008.%5&V.% K@T7(61F 16>OaK008.%8E1&>Oa xEQ8]qC4 l 8]c#3@.%EAN&X.% #34DC'()"'&.%I<4 N.%8&y4L@UA7DK(01P`1F]q. %*0C1*c41*q4516>OaE<3czc4czq& t ,(H(*0T0#$%nA^T #3'()"'04495&[#DKC#3 A7+. %#3'()"0S{J49T,(/@*2449T@ (/@2&,(#!64-1;@U&I< 0|0.%9#$%-1;@U,(& X#4(m4&XQ#4(9B%8#4(}1F#3 '()"'0|01:4@9CN.%(6&en 81:#4(7L#5#$%8&,(#$ %(6C@.%m1F\65$& XQ,(4#4(-1:7B@(%G1:C8 .%&+.%1C0S@(A&dL@U.%*0@1*c x#.1-8]~~7*0@1*qx-.145 8]~@*~& +.%m#3(6@AG`*/`* @*10*2&eT816G808`*#3C&V +.%C7#!'()"'1FC1fDt`*J1@/16 Gz271@/16Gc2741@*/16Gq2&=8`*#3#8. ]07K74G8+&=D-CA8`*8&dL@U1*cC `*`*c741*qC`*`*q&'()"'K00816G`*+.% 4#ADG`*.%-& [7+.%-A.01#.U488] 4"1!N&X.%m#3@GA#8 .G#!&=D1F@9(0*44**4A.G#! .%& a) Bảng thông tin tiến trình '()"'#KD@18A(6N. %/0*11*2&e.%I<K>Oa(6945G .4"8.%&dL@UDN(017#!N G.%4](A.%#3NJ! g .=>?.%7A#!1;@U.%7M b) Xem thông tin của tiến trình (01'()"'@9]G.4".%&X9* 167011F.G4".%#!@97.%(6K 8.%&dL@U011F#.n16s` X8G@014"7?OaA#!@9N.%7>Oa 16]@(6K0.%7>>Oa16]@.% /0*>Oa2&ySD1F016.%-]@>>Oac7] @.%7#3N(6C&[.D. %%'()"'1FK@T0A4(&•XO€!.% #3#41;@U&XO€!.@U=>?.%&=a @B(.%#3(N&XX•%*$NH .%&[#D.7#!@9-04(6QK "*8N.%&)(A8.%(67D1; @U(Jp01P 4. Tạo lập tiến trình a) Gọi tiến trình mới bằng hàm system() =D-N.%8A#$%H n11*/2&=-^D-.%5Q.% &'11*/2#38#1J #include <stdlib.h> int system( const char (cmdstr) ) 'N+(@1H4!(K@T5I4"$N &[-#$#$454(N1*H((6Jp1P@1 11*/21F4",+cqu.#GC#31*N(@1& ,+sc.08+8&=B7,4"11*/2,+@@11 (#3N4"& ‚ dL@U1;@U11*/2711*& #include <stdlib.h> #include <stdio.h> int main() { printf( "Thuc thi lenh ps voi system\n" ); system( "ps –ax" ); printf( "Thuc hien xong. \n" ); exit( 0 ); } '11*/2D#31;@UN(ƒ01P„'()"'& b) Thay thế tiến trình hiện hành với các hàm exec +.%#3'()"'K0cG58(.% H@&[..%…D(N#$%e/n 11*/2f27'()"'#!H(88#JK008 G5.%57"_@188.%70,( #$%eA^T4G54QK008.%&)#. %54@18E"06'()"'&[G4(#! K!84.AA(6& [..%…4.D6.%eC G5-1Y.%…%-1;@U8**#3 K05&=8**1F..%…/ ,(7 @(7G`*2.%e8&=_-16] @>Oa.%…B&X0** 81J #include <unistd.h> extern char **environ; int execl( const char *path, const char *arg, ); int execlp( const char *file, const char *arg, ); v int execle( const char *path, const char *arg, , char *const envp[] ); int exect( const char *path, char *const argv[] ); int execv( const char *path, char *const argv[] ); int execvp( const char *file, char *const argv[] ); )168"AED_6160`*#!@†. A#$%EHA^&8616E"#$%H 7616#$H8DN#$%Q@B(& dL@U1;@U**70**& #include <unistd.h> #include <stdio.h> int main() { printf( "Thuc thi lenh ps voi execlp\n" ); execlp( "ps", "ps", "–ax", 0 ); printf( "Thuc hien xong. Nhung chung ta se khong thay duoc dong nay.\n" ); exit( 0 ); } c) Nhân bản tiến trình với hàm fork() sX..%GK345D&)-.%5. G.%m4D1FG-18m#" .0.%(%1N**&=8$8 #$%#!@9-1;@U`/2S1 5.%&`/28(7H7-1F4"q8]8 EH7145%#!_4"c8]EH& V8`/2#1J #include <sys/types.h> #include <unistd.h> u pid_t fork() [.G7`/21F8.%(q.%/@^A'()" '0K008AG5.%52&X.% EN.%/0*0*112.%5N.% /@0*112&X.%1F-16]@>OaA(&7.% BA]@>>Oa16]@>Oa.%& •8.%7,(HC.%#31|0 6&=_-@K(D-@.%4. %7-]4"`/2&eA.%7`/21F4"] z&XA.%7`/21F4"]16A_>Oa .%4Q&X#!30G8#3.%7`/21F4"]sc&V 0@‡#384]^1@&16A/2& ),"41;@U`/2#!-@}1J pid_t new_pid; new_pid = fork(); // tách tiến trình switch (new_pid) { case -1: printf( "Khong the tao tien trinh moi" ); break; case 0: printf( "Day la tien trinh con" ); // mãlệnh dành cho tiến trình con đặt ở đây break; default: printf( "Day la tien trinh cha" ); // mãlệnh dành cho tiến trình cha đặt ở đây break; } sdL@U1;@U`/27`‡@*& w #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main() { pid_t pid; char * message; int n; printf( "Bat dau.\n" ); pid = fork(); switch ( pid ) { case -1: printf( "Khong the tao tien trinh moi" ); exit(1); case 0: message = "Day la tien trinh con"; n = 0; for ( ; n < 5; n++ ) { printf( "%s", message ); sleep( 1 ); } break; default: message = "Day la tien trinh cha"; n = 0; for ( ; n < 3; n++ ) { printf( "%s", message ); sleep( 1 ); } break; } ˆ exit( 0 ); } eA@]4H#$%7D1FKnq.% !4.I*&[.6*1HAI4">Oa4 >>Oaq.%4(`/20817D-H( #$%#1J p`‡@*o01P` d) Kiểm soát và đợi tiến trình con V`/28.%L.%47AH. .%†.%"0&)GD.%E03 .%H(84U%5.0UH&y4L@UA7H7 D1FKn.%.D.%4†G84 .%4.%"C.I%&=DG 6"7D6n.%.D%.%m K8-&'$7#$%EH(84U-% 5.#$%&)#34(7D1;@Uk/2 #include <sys/types.h> #include <sys/wait.h> pid_t wait(int &stat_loc); 'k#3N1FAE.%@Q!.%.D #5H(.08(".%&k/21HA( .%4.%CAEH&V.%.D71F 4"16>Oa#$T.%&[.D"A6161‡8 [?%k/2m1F4"8.%.D. 1‡&=D-1;@U881Y11‰kJ cz [...]... (stat_loc): Trả về trị kh c 0 nếu tiến trình con kết th c bình thường WEXITSTATUS (stat_loc): Nếu WIFEXITED trả về trị kh c 0, macro này sẽ trả về mãlỗi c a tiến trình con WIFSIGNALED (stat_loc): Trả về trị kh c 0 nếu tiến trình con kết th c bởi một tín hiệu gửi đến WTERMSIG(stat_loc) : Nếu WIFSIGNALED kh c 0, macro này sẽ cho biết số tín hiệu đă hủy tiến trình con WIFSTOPPED(stat_loc): WSTOPSIG(stat_loc)... Trả về trị kh c 0 nếu tiến trình con đă dừng Nếu WIFSTOPPED trả về trị kh c 0, macro này trả về số hiệu c a signal Ví dụ c ch sử dụng hàm wait() để chờ tiến trình con kết th c sau khi gọi fork(), wait_child .c #include #include #include int main() { pid_t pid; int child_status; int n; // nhân bản tiến trình, tạo bản sao mới pid = fork(); switch ( pid ) { case -1: //... đư c tiến trình mới printf( "Khong the tao tien trinh moi" ); exit( 1 ); case 0: // fork thành c ng, chúng ta đang ở trong tiến trình con printf( "Hello world from child\n" ); 11 n = 0; for ( ; n < 3; n++ ) { printf( "Tien trinh con" ); sleep( 1 ); } exit( 0 ); // Mãlỗi trả về c a tiến trình con default: // fork thành c ng, chúng ta đang ở trong tiến trình cha printf( "Tien trinh cha, cho tien trinh con... thanh.\n" ); // Chờ tiến trình con kết th c wait( &child_status ); printf( "Tien trinh cha – tien trinh con hoan thanh.\n" ); } return ( 0 ); } Trong ví dụ trên, chúng ta tuy rằng đă c sử dụng biến child_status, nhưng chưa dùng nó để xem xét mã lỗi trả về c a tiến trình con Ví dụ dưới đây sẽ th c hiện vi c này, wait_child2 .c #include #include #include #include ... // Mã lỗi trả về c a tiến trình con default: // fork thành c ng, chúng ta đang ở trong tiến trình cha n = 3; for ( ; n > 0; n ) { printf( "Tien trinh cha" ); sleep( 1 ); } // Chờ tiến trình con kết th c wait( &child_status ); // Kiểm tra và in mãlỗi trả về c a tiến trình con printf( "Tien trinh con hoan thanh: PID = %d\n", pid ); if ( WIFEXITED( child_status ) ) printf( "Tien trinh con thoat ra voi... int main() { char *message; int n; pid_t pid; int child_status; // nhân bản tiến trình, tạo bản sao mới pid = fork(); 12 switch ( pid ) { case -1: // fork không tạo đư c tiến trình mới printf( "Khong the tao tien trinh moi" ); exit( 1 ); case 0: // fork thành c ng, chúng ta đang ở trong tiến trình con printf( "Hello world from child\n" ); n = 5; for ( ; n > 0; n ) { printf( "Tien trinh con" ); sleep(... trả về c a tiến trình con printf( "Tien trinh con hoan thanh: PID = %d\n", pid ); if ( WIFEXITED( child_status ) ) printf( "Tien trinh con thoat ra voi ma %d\n", WEXITSTATUS( child_status ) ); else printf( "Tien trinh con ket thuc binh thuong\n" ); break; } 13 exit( 0 ); } 14 . 81J #include <unistd.h> extern char **environ; int execl( const char *path, const char *arg, ); int execlp( const char *file, const char *arg, ); v int execle( const char *path, const char. const char *arg, , char *const envp[] ); int exect( const char *path, char *const argv[] ); int execv( const char *path, char *const argv[] ); int execvp( const char *file, char *const argv[] ); )168"AED_6160`*#!@†. A#$%EHA^&8616E"#$%H 7616#$H8DN#$%Q@B(& dL@U1;@U**70**& #include. đang ở trong tiến trình cha printf( "Tien trinh cha, cho tien trinh con hoan thanh.
" ); // Chờ tiến trình con kết th c wait( &child_status ); printf( "Tien trinh cha – tien