Bài giảng Thực hành UNIX/Linux - Phần 2

Nội dung
„ Biên dịch và thực thi chương trình C/C++
„ Giới thiệu về process
z Tổ chức của một process
z Background và foreground process
z Các lệnh thao tác với process
„ Lập trình process với fork(), exec…() 
pdf 74 trang thiennv 08/11/2022 3600
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Thực hành UNIX/Linux - Phần 2", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_giang_thuc_hanh_unixlinux_phan_2.pdf

Nội dung text: Bài giảng Thực hành UNIX/Linux - Phần 2

  1. BiênBiên ddịịchch chchươươngng trtrììnhnh C/C++C/C++ ((t.tt.t)) Liên kết (link) nhiềufile đốitượng (object files) đãcó g++ -o myapp main.o reciprocal.o gcc -o myapp main.o reciprocal.o Tên file tạoralàgì? Chobiếtquyềnhạntrênfile đó? Thựcthitạidấunhắclệnh: $ ./myapp 3 Liên kếtobject files vớicácthư viện (libraries) khác -Liênkếtvớithư việnchuẩn POSIX pthread (/usr/lib/libpthread.so) gcc -o myapp main.o -lpthread -Liênkếtvớithư viện libutility.a ở thư mục /usr/local/lib/somelib gcc -o myapp main.o -L/usr/local/lib/somelib -lutility -Liênkếtvớithư viện libtest.so ở thư mụclàmviệchiệnhành gcc -o myapp main.o -L . -ltest Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.11
  2. BiênBiên ddịịchch chchươươngng trtrììnhnh C/C++C/C++ ((t.tt.t)) Lưuý khibiêndịch trong Linux Dùng g++ nếuchương trình có chứamãC lẫn C++ Dùng gcc nếuchương trình chỉ có mã C File thựcthitạorakhôngcóđuôi.exe, .dllnhư môi trường Windows. Giả sửứng dụng củabạngồmnhiềuhơnmột file source code, e.g main.c và reciprocal.c. Để tạothànhchương trình thực thi, bạncóthể biên dịch trựctiếpbằng mộtlệnh gcc như sau: gcc-o myappmain.creciprocal.c Cách làm thủ công như trên sẽ bấttiện và không hiệuquả khi ứng dụng gồm quá nhiềufile (khoảng >10 files ??? ). Tham khảothêmcôngcụ rấthữuíchlàGNU make. Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.12
  3. ThThưư viviệệnn llậậpp trtrììnhnh trongtrong LinuxLinux LibrariesLibraries statically linking dynamically LibrariesLibraries linking Cho biết ưuvàkhuyết điểmcủa statically vs. dynamically linking? Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.13
  4. ThThưư viviệệnn llậậpp trtrììnhnh trongtrong LinuxLinux Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.14
  5. CCáácc loloạạii ththưư viviệệnn llậậpp trtrììnhnh Archives (static library) Là tậphợp các file object tạo thành mộtfile đơnnhất Tương tự file .LIB trên Windows Khi bạnchỉđịnh liên kết ứng dụng củamìnhvớimột static library thì linker sẽ tìm trong thư viện đó để trích xuấtnhững file object mà bạncần. Sau đó, linker sẽ tiếnhànhliênkết các file object đóvào chương trình củabạn. Cách thứctạothư việntĩnh (archive file) Giả sử bạn có hai file mã nguồnchứa hàm là a.c và b.c a.c b.c int func1(){ double func2(){ return 7; return 3.14159; } } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.15
  6. CCáácc loloạạii ththưư viviệệnn llậậpp trtrììnhnh ((t.tt.t)) Tạothư việntĩnh tên là libab.a 1. Biên dịch tạo các file object $ gcc -c a.c b.c 2. Dùng lệnh ar để tạo thành thư việntĩnh tên là libab.a $ ar cr libab.a a.o b.o 3. Có thể dùng lệnh nm để xem lạikếtquả $ nm libab.a 4. Có thể dùng lệnh file để xem file libab.a là loại file gì $ file libab.a Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.16
  7. CCáácc loloạạii ththưư viviệệnn llậậpp trtrììnhnh ((t.tt.t)) Tạo ứng dụng đơngiảncósử dụng hàm thư việntronga.c myapp.c int main(){ printf("Ke^'t qua? du`ng ha`m func1: %d\n", func1()); exit(0); } Biên dịch không có link thư việntĩnh libab.a $ gcc myapp.c /tmp/cc2dMic1.o: In function `main': /tmp/cc2dMic1.o(.text+0x7): undefined reference to `func1' collect2: ld returned 1 exit status Biên dịch có link đếnthư việntĩnh libab.a $ gcc -o myapp myapp.c -L. -lab hoặc gcc -o myapp myapp.c libab.a $ ./myapp Ke^'t qua? du`ng ha`m func1: 7 Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.17
  8. CCáácc loloạạii ththưư viviệệnn llậậpp trtrììnhnh Thư việnliênkết động (dynamic, shared library) Tương tự thư việndạng .DLL của Windows Thư mụcchứathư việnchuẩn /usr/lib, /lib Tạothư việnliênkết động libab.so từ a.c và b.c 1. Biên dịch tạo các file object có dùng tùy chọn-fPIC $ gcc -c -fPIC a.c b.c 2. Tạothư việnliênkết động tên là libab.so $ gcc -shared -fPIC -o libab.so a.o b.o 3. Có thể dùng lệnh file để xem file libab.so là loại file gì $ file libab.so libab.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.18
  9. CCáácc loloạạii ththưư viviệệnn llậậpp trtrììnhnh ((t.tt.t)) Tạo ứng dụng vớifile myapp.cnhư ví dụ trước Biên dịch link vớithư việntĩnh libab.so $ gcc myapp.c /tmp/cc2dMic1.o: In function `main': /tmp/cc2dMic1.o(.text+0x7): undefined reference to `func1' collect2: ld returned 1 exit status Biên dịch có link đếnthư việntĩnh libab.a $ gcc -o myapp myapp.c -L. -lab hoặc gcc -o myapp myapp.c libab.so $ ./myapp ./myapp: error while loading shared libraries: libab.so: cannot open shared object file: No such file or directory Tại sao??? Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.19
  10. CCáácc loloạạii ththưư viviệệnn llậậpp trtrììnhnh ((t.tt.t)) Nguyên nhân: do loader tìm trong thư mụcthư việnchuẩnnhư /usr/lib, /lib không có libab.so !!! Cách giảiquyết(cũng là cách dùng để triển khai - deploy, một ứng dụng có sử dụng thư viện liên kết động) 1. Nếucóđủ quyềnhạn (e.g. root) thì copy các file thư việnchiasẻ và thư mụcchuẩn # cp libab.so /lib $ ./myapp Ke^'t qua? du`ng ha`m func1: 7 2. Nếu không có đủ quyềnhạn copy file vào thư mụcchuẩn, user phải thay đổibiếnmôitrường LD_LIBRARY_PATH để chỉ cho loader tìm trong thư mụcchứathư viện. $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. $ ./myapp Ke^'t qua? du`ng ha`m func1: 7 Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.20
  11. CCáácc loloạạii ththưư viviệệnn llậậpp trtrììnhnh ((t.tt.t)) Mộtsố chú ý khi lậptrìnhvớithư việnliênkết động Kiểmtraxemứng dụng cuốicùngcủamìnhtạoraphụ thuộcvào các thư viện liên kết động nào bằng lệnh ldd. Nếubị thiếuthư viện thì phảikhắcphục theo 2 cách ở trên $ ldd myapp libab.so => not found libc.so.6 => /lib/i686/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Trong thư mụchiệntạicó2 thư viện là libab.a và libab.so. Khi đó, linker sẽưu tiên liên kếtthư viện.so trước. Muốnchỉđịnh buộc linker tiếnhànhliên kếttĩnh vớithư viện libab.a thì thêm tùy chọn-static $ mv libab.so libab.so.old $ gcc -static -o myapp myapp.c -L. -lab $ ./myapp Ke^'t qua? du`ng ha`m func1 7 Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.21
  12. CCơơ bbảảnn vvềề PROCESSPROCESS Process: chương trình đang thựcthi. User có thể theo dõi trạng thái của process, tương tác với process Có hai loại user process chủ yếutronghệ thống Foreground process Background process Các “process” thựchiệncáccôngviệccủahệđiều hành còn gọi là các kernel_thread, daemon Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.22
  13. TheoTheo dõidõi ccáácc processprocess Xem trạng thái các process (process status) ps [option] Options -e chọntất các process -f liệtkêtấtcả (full) các thuộctính -A liệtkêtấtcả processs Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.23
  14. ThThựựcc thithi foregroundforeground processprocess Khi gõ lệnh tương ứng vớitênchươngtrìnhtheocáchthông thường Khi click vào icon trên giao diện đồ hoạ tương ứng vớichương trình. Chương trình chạymặttiềntương tác đượcvớingười dùng qua thiếtbị nhậpchuẩn (standard input) là bàn phím. Kếtxuấtcủachương trình chủ yếulàthiếtbị xuấtchuẩn (standard output) là màn hình. Trình thông dịch lệnh sẽ bị blocked cho tới khi foreground process kết thúc Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.24
  15. KKếếtt ththúúcc ththựựcc thithi foregroundforeground processprocess Dùng tổ hợpphímCtrl-C Ví dụ: $find / -name “*.ps” -print ^C Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.25
  16. TTạạmm hoãnhoãn ththựựcc thithi foregroundforeground processprocess Dùng tổ hợpphím: Ctrl-Z Process tương ứng chuyểnsang trạng thái suspended Ví dụ $ find / “*.profile” -print ^Z [1]+ Stopped find / ".profile" -print $ps PID TTY TIME CMD 2750 pts/1 00:00:00 bash 2881 pts/1 00:00:00 find 2883 pts/1 00:00:00 ps Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.26
  17. TTạạmm hoãnhoãn ththựựcc thithi foregroundforeground processprocess ((t.tt.t)) Sau khi bị tạmhoãnthựcthibằng ^Z, chúng ta có thể dùng lệnh ps để xem. Mộtlệnh tiệníchkháchiển thị thông tin này là jobs Nếumuốn cho process tiếptụcthực thi foreground, dùng lệnh fg n (trong đón làchỉ số củajob hiểnthị trong ngoặc vuông, ví dụ [1], [4], ), còn muốn process thực thi background thì dùng lệnh bg n. Ví dụ $ jobs [1]+ Stopped find / ".profile" –print $ fg 1 hoặc $ bg 1 Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.27
  18. ThThựựcc thithi processprocess ởở backgroundbackground Thêm dấu& (ampersand) vàocuốilệnh Ví dụ: $find /home/a* -name *.profile –print > kq & [1] 2548 Trình thông dịch lệnh tạoramột process tương ứng với chương trình đó đồng thời in ra job number ([n]) và PID (Process IDentifier) của process đượctạora. Ngay sau khi thực thi, trình thông dịch sẵnsàngnhận lệnh mới (không bị blocked nhưđốivới foreground process) Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.28
  19. ThThựựcc thithi backgroundbackground processprocess Background process vẫnxuấtkếtquả ra standard output là màn hình trong lúc thựcthi cầntáiđịnh hướng standard output để tránh mấtdữ liệu xuất. Người dùng không thể tương tác vớichương trình qua standard input là bàn phím với background proces cầnphảitáiđịnh hướng standard input thông qua file nếu process đócầnnhậpdữ liệu. Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.29
  20. QuQuảảnn lýlý backgroundbackground processprocess Liệtkêcácjob đang hoạt động - dùng lệnh jobs $jobs -l [1] + 3584 Running xterm -g 90x55 [2] - 3587 Running xterm -g 90x55 Đốivới các quá trình, có thể: Có thể chuyển process từ thực thi background sang foreground và ngượclạidùnglệnh fg hoặc bg Kết thúc mộtquátrình(~ mộtjob) Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.30
  21. ChuyChuyểểnn foregroundforeground ththàànhnh backgroundbackground processprocess 1. Trì hoãn quá trình đó(bằng Ctrl + Z) 2. Dùng lệnh bg (background) để chuyển process sang chếđộthực thi background. Ví dụ: $ls –R / > kq ^Z [1]+ Stopped ls –R / >kq $bg (vì chỉ có một jobs nên bg không cầnthamsố) [1]+ ls –R / > kq & Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.31
  22. ChuyChuyểểnn backgroundbackground ththàànhnh foregroundforeground processprocess Dùng lệnh fg fg job_number (Nếuchỉ có mộtquátrìnhchạy background thì lệnh fg không cần tham số job_number) Ví dụ: $ls -R / > kq & [1] 2959 $jobs [1]+ Running ls -R / >kq & $ fg 1 Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.32
  23. KKếếtt ththúúcc ququáá trtrììnhnh Dùng lệnh kill kill [-signal] process_identifier (PID) Cần dùng lệnh ps trước để biếtPID của quá trình. Có thể dùng lệnh đơngiảnnhư sau: kill process_identifier or kill -9 process_identifier Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.33
  24. LLậậpp trtrììnhnh PROCESSPROCESS Kiếntrúchệ thống *NIX Tổ chứccủa process Xử lý tham số dòng lệnh (command line arguments) Tạomớivàkết thúc process Gọithựcthilệnh/chương trình khác bằng system(), exec () Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.34
  25. SSơơ llưượợcc vvềề *NIX*NIX Đơnkhối (monolithic) Đanhiệm (multitasking) Nhiềungười dùng đồng thời (multiuser) Đadụng (general purpose) Chia sẻ thờigian(time-sharing) Bảomật Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.35
  26. MMộộtt ssốố nhnháánhnh phpháátt tritriểểnn BSD UNIX: California Univ. of Berkeley System V: AT&T SunOS/Solaris: Sun Microsystem AIX: IBM Corp. HP-UX: Hewlett-Packard Linux: Linus Torvalds Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.36
  27. KiKiếếnn trtrúúcc ttổổngng quanquan Ứng dụng Giao diệnlập trình Nhân (kernel) Phầncứng Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.37
  28. KiKiếếnn trtrúúcc luluậậnn lýlý (the users) Shell and commands Compilers & Interpreters System libraries Signals File system CPU scheduling Termial handling Swapping Page replacement Character I/O system Block I/O system Demand paging Terminal drivers Disk & tape drivers Virtual memory Terminal controllers Device controllers Memory controller Terminals Disks & tape Physical memory Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.38
  29. *NIX*NIX KernelKernel User level System Call Interface IPC File System Process Control Scheduler System Memory Device Management Driver Hardware Control Hardware Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.39
  30. KernelKernel vs.vs. useruser spacespace Kernel Space root (0) kswapd (5) User Space init (1) sh sh sh Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.40
  31. QuQuảảnn lýlý ccáácc ququáá trtrììnhnh Đanhiệm Tác vụ -> process. Mỗi process có: Không gian địachỉ (address space) Code thựcthi Các vùng chứadữ liệu Stack Trạng thái process: registers, program counter, stack pointer, . Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.41
  32. DanhDanh đđịịnhnh ccủủaa processprocess Process identifier (PID) duy nhất, tăng dầntừ 0 Mộtsố PID đặcbiệt: 0: root 1: init Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.42
  33. BBộộ nhnhớớ ccủủaa processprocess Text: chứachương trình – code thựcthi-chứacác các instruction dành cho CPU thựchiện-read only. Data: vùng dữ liệu-chứacácbiến đượckhaibáo tĩnh hoặc động - xin cấp phát trong lúc thựcthi. Stack: chứatrạng thái và các thông tin liên quan đến việcgọihàm. Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.43
  34. CCấấuu trtrúúcc bbộộ nhnhớớ Process memory layout: Text segment (code) High address argc/argv[] Data segment Stack segment Stack Heap Command-line arguments Heap end Environment variables Uninitialized data edata Initialized data etext Text segment Low address Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.44
  35. CCấấuu trtrúúcc bbộộ nhnhớớ Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.45
  36. ĐĐịịaa chchỉỉ bbộộ nhnhớớ Địachỉ do process tham khảochỉ là địachỉảo Có thể truy xuất thông tin bộ nhớ qua các biến toàn cục: etext: địachỉ sau vùng text edata: địachỉ kết thúc vùng initialized data end: Địachỉ bắt đầu vùng heap Định nghĩamacro để in địachỉ mộtbiến #define PADDR(x) printf(#x " at %u\n", &x); Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.46
  37. VVíí ddụụ #include #include #define PADDR(x) printf(#x " at %u\n", &x); extern unsigned etext, edata, end; int a = 0, b; int main(int argc, char *argv[]) { printf("End of text seqment at %u\n", &etext); printf("End of initialized statics and externals at %u\n", &edata); printf("End of uninitialized statics and externals at %u\n", &end); PADDR(a); PADDR(b); return 0; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.47
  38. LLấấyy đđốốii ssốố vvàà bibiếếnn môimôi trtrưườờngng Chương trình C int main(int argc, char *argv[]) { } Trong đó int argc: số tham số củachương trình khi chạy char *argv[]: danh sách các tham số Ngoài ra, còn có các biếnngoại(external variable) extern char environ: danh sách biếnmôitrường Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.48
  39. LLấấyy đđốốii ssốố vvàà bibiếếnn môimôi trtrưườờngng ((t.tt.t)) Giả sử bạnmuốnviếtmộtchương trình tên là myapp, nhậntừ dòng lệnh n tham số là số nguyên, chương trình sẽ hiểnthị dòng thông báo cho biếtsố lớnnhất. Gọithựcthichương trình myapp. $ ./myapp 12 34 56 78 The biggest integer is 78 Gọithựcthilệnh ở dấunhắc Chương trình myapp.c $ ./myapp 12 34 56 78 int main(int argc, char *argv[]) { } argc argv 55 "./myapp" "12" "34" "56" "78" Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.49
  40. VVíí ddụụ #include #include extern char environ; int main(int argc, char *argv[]) { int i; printf("\nNumber of arguments is %d",argc); printf("\nArguments:\n"); for(i=0; i<argc; i++) printf("argv[%d]=%s\n",i,argv[i]); getchar(); for (i=0; environ[i]!=(char *)0; i++) printf("%s\n",environ[i]); return 0; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.50
  41. LLấấyy PIDPID ccủủaa processprocess #including pid_t getpid(void); LấyPID của process hiệnhành pid_t getppid(void); LấyPID của process cha Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.51
  42. VVíí ddụụ #include #include int main() { printf("Process id: %d\n", getpid()); printf("Parent process id: %d\n", getppid()); return 0; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.52
  43. TTạạoo processprocess Hệđiềuhànhtạo process bằng cách nhân bảnmột process đang tồntại. Process mới đượctạoragọi là con (child), process kia là process cha (parent). Parent fork() Child Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.53
  44. ChuChu kkỳỳ ssốốngng ccủủaa processprocess Parent wait() Parent Process Process fork() Child Child Zombie Process Process Process exec exit Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.54
  45. TTạạoo processprocess Dùng hàm: pid_t fork(void); Nếu thành công: trả về 0 trong thân process con PID của con (>0) trong thân process cha. Nếuthấtbại, trả về -1 và lý do kèm theo: ENOMEM: không đủ bộ nhớ EAGAIN: số process vượtquágiớihạnchophép Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.55
  46. VVíí ddụụ Dạng mẫuchương trình pid_t pid; pid = fork(); if (pid==0) { // child code here } else if (pid > 0) { // parent code here } else { // error warning } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.56
  47. TTạạoo processprocess Parent process Text Data fork() Child process Stack Text Data Stack Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.57
  48. VVíí ddụụ #include #include int main() { int childid; if ((childid=fork())==0) { printf("Child process output: PID = %d\n",getpid()); printf("My parent PID is %d\n",getppid()); }else if(childid > 0) { printf("Parent process output: PID= %d\t", getpid()); printf("Child PID=%d\n", childid); }else { printf("Fork error !\n"); exit(1); } return 0; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.58
  49. KKếếtt ththúúcc processprocess Dùng system call exit(): Orphaned process: process cha kết thúc trước process con sau đósẽ có cha là init (PID=1) Zombied process Process kết thúc nhưng chưabáotrạng thái cho process cha biết. Dùng hàm wait() hay waitpid() ở process cha để lấytrạng thái trả về từ process con. Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.59
  50. KKếếtt ththúúcc processprocess waitpid() system call: #include #include pid_t waitpid(pid_t pid, int *stat_loc, int options); (Trả về PID của process con kết thúc, hoặc-1 nếuthấtbại) Đốisố pid : 0: ĐợipocesscóPID bằng vớigiátrị này Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.60
  51. KKếếtt ththúúcc processprocess wait() system call: #include #include pid_t wait(int *stat_loc); Tham khảo thêm man pages củasystem call waitpid(), wait() Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.61