Cơ sở dữ liệu - Thực hành unix / linux

pdf 74 trang vanle 3360
Bạn đang xem 20 trang mẫu của tài liệu "Cơ sở dữ liệu - Thực hành unix / linux", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfco_so_du_lieu_thuc_hanh_unix_linux.pdf

Nội dung text: Cơ sở dữ liệu - Thực hành unix / linux

  1. ThThựựcc hhàànhnh UNIX/LinuxUNIX/Linux phphầầnn 22
  2. NNộộii dungdung Biên dịch và thựcthichương trình C/C++ Giớithiệuvề process Tổ chứccủamột process Background và foreground process Các lệnh thao tác với process Lập trình process với fork(), exec () Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.2
  3. QuQuáá trtrììnhnh ttạạoo processprocess gas/gcc/g++ gcc/g++ .c, .cpp, .cc .o Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.3
  4. BBộộ côngcông ccụụ phpháátt tritriểểnn ứứngng ddụụngng GNUGNU GNU Compiler Collection (GCC) Thư việncáchàmtiện ích: libc, libstdc++, Các trình biên dịch gcc, g++, gcj, gas, Trình khử lỗigdb Trình tiện ích khác trong binutils như nm, strip, ar, objdump, ranlib (dùng lệnh info binutils để xem thêm) Tiệních: gmake Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.4
  5. TrTrììnhnh biênbiên ddịịchch GNUGNU C/C++C/C++ Công cụ dùng biên dịch các chương trình C/C++ Quá trình biên dịch thành file thựcthigồm 4 giai đoạntheothứ tự như sau: 1. preprocessing (tiềnxử lý) 2. compilation (biên dịch) 3. assembly (hợpdịch) 4. linking (liên kết) Ba bước 1, 2, 3 chủ yếulàmviệcvớimộtfile đầuvào Bước4 cóthể liên kết nhiều object module liên quan để tạo thành file thực thi nhị phân (executable binary) Lậptrìnhviêncóthể can thiệpvàotừng bước ở trên ☺ Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.5
  6. GNUGNU C/C++C/C++ compilercompiler ((gcc/ggcc/g++)++) e.g. hello.c source codes .c,.cc.c,.cc gcc -E hello.c -o hello.cpp preprocessed gcc -S hello.c [-o hello.s] source files .cpp hello.cpp gcc -x cpp-output -S hello.cpp [-o hello.s] assembly .s source code gcc -x assembler -c hello.s [-o hello.o] object hello.o code gcc -c hello.c [-o hello.o] b.o a.o gcc hello.c [-o hello] gcc a.o b.o hello.o [-o hello] executable a.out/hello binary Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.6
  7. TTóómm ttắắtt mmộộtt ssốố ttùùyy chchọọnn ccủủaa gccgcc Tùy chọn Công dụng Chỉđịnh tên của file output (khi biên dịch thành file thựcthi, nếu không -o FILE có -o filename thì tên file mặc định sẽ là a.out) -c Chỉ biên dịch mà không linking (i.e. chỉ tạo ra object file *.o) Chỉ tên thư mục DIRNAME là nơichứa các file header (.h) mà gcc sẽ tìm -IDIRNAME trong đó(mặc định gcc sẽ tự tìm ở các thư mụcchuẩn/usr/include, ) Chỉ tên thư mục DIRNAME là nơichứacácthư viện (.a, .so) mà gcc sẽ tìm -LDIRNAME trong đó(mặc định gcc sẽ tự tìm ở các thư mụcchuẩn/usr/lib, ) -O [n] Tối ưumãthựcthitạo ra (e.g. -O2, -O3, hoặc-O) -g Chèn thêm mã phụcvụ công việcdebug -E Chỉ thựchiệnbướctiềnxử lý (preprocessing) mà không biên dịch -S Chỉ dịch sang mã hợpngữ chứ không linking (i.e. chỉ tạo ra file *.s) -lfoo Link với file thư việncótênlàlibfoo (e.g. -lm, -lpthread) -ansi Biên dịch theo chuẩn ANSI C/C++ (sẽ cảnh báo nếu code không chuẩn) Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.7
  8. BiênBiên ddịịchch chchươươngng trtrììnhnh C/C++C/C++ File main.c #include #include "reciprocal.h" int main (int argc, char argv) { int i; i = atoi (argv[1]); printf ("The reciprocal of %d is %g\n", i, reciprocal (i)); return 0; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.8
  9. BiênBiên ddịịchch chchươươngng trtrììnhnh C/C++C/C++ ((t.tt.t)) File reciprocal.h extern double reciprocal (int i); File reciprocal.c #include /* some debug routines here */ #include "reciprocal.h" double reciprocal (int i) { assert (i != 0); /* used for debugging */ return 1.0/i; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.9
  10. BiênBiên ddịịchch chchươươngng trtrììnhnh C/C++C/C++ ((t.tt.t)) Biên dịch (không link) mộtfile chương trình nguồnC đơnlẻ gcc -c main.c Kếtquả là object file tên main.o Biên dịch (không link) file chương trình nguồnC++ g++ -c myprog.cpp Kếtquả là file object tên là myprog.o Biên dịch (không link) main.c có sử dụng các file *.h trong thư mục include/ (dùng tùy chọn-I để chỉđịnh đường dẫn) gcc -c -I /include reciprocal.c Biên dịch (không link) có tối ưumã gcc -c -O2 main.c Biên dịch có kèm thông tin phụcvụ debug => kích thướcfile output lớn gcc -g reciprocal.c Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.10
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. *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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. CCấấuu trtrúúcc bbộộ nhnhớớ Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.45
  46. ĐĐịị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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. VVíí ddụụ #include #include #define PROCESSES 3 /*Number of processes */ int main( int argc, char *argv[]) { int count, retval, child_no; /*Creating processes*/ retval = 1; for( count = 0; count < PROCESSES; count++ ) { if( retval != 0 ) retval = fork(); else break; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.62
  63. VVíí ddụụ ((titiếếpp theotheo)) /* Execution of child processes */ if( retval == 0 ) { child_no = count; printf("Child #%d has PID (process-id):#%d\n", getpid()); sleep(rand()%5); } else { /* Waiting for children termination */ for( count = 0; count < PROCESSES; count++ ) wait(NULL); } return 0; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.63
  64. CCáácc hhààmm ggọọii ththựựcc thithi chchươươngng trtrììnhnh int system (const char *string); int execl (const char *path, const char *arg, ) int execv (const char *path, const char *argv[ ]) int execlp (const char *lename, const char *arg, ) int execvp (const char *lename, const char *argv[ ]) int execle (const char *path, const char *arg, , const char env) int execve (const char *path, const char *argv[ ], const char env) Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.64
  65. intint system(constsystem(const charchar *string)*string) Xử lý mộtlệnh đượcchỉ ra trong thông số string và trả về sau khi lệnh đượcthựcthixong Thựcchấtthìlờigọihàmsystem(string) sẽ thựchiệnlệnh sh -c string (trong đó sh là shell, trong Linux sh chính là trình bash) Giá trị trả về: -127: mã lỗi không khởi động shell để thựchiệnlệnh -1: mã lỗikhác #include int main(int argc, char argv) { if(!system("ls -l /")) printf("Call system() OK!\n"); return 0; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.65
  66. CCáácc hhààmm execexec ()() Các hàm exec () thựchiệnnhư sau: Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.66
  67. CCáácc hhààmm execexec ()() Chú ý Các hàm exec sẽ thay thế process gọihàmbằng chương trình tương ứng trong tham số nhậpcủa hàm. Vùng text, data, stack bị thay thế, vùng u (user area) không bị thay thế. Chương trình đượcgọibắt đầuthựcthiở hàm main() (entry point), có thể nhậnthamsố nhập thông qua các tham số truyềnvàocác hàm exec. Gọithựcthilệnh ở dấunhắc Chương trình dùng exec () $ ls -R /usr /lib execl( Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.67
  68. CCáácc hhààmm execexec ()() Phân tích tên gọicáchàmexec () int execl (const char *path, const char *arg, ) int execv (const char *path, const char *argv[ ]) Hàm có chứakítự v (execv, execvp, execve) accept the argument list for the new program as a NULL-terminated array of pointers to strings. Functions that contain the letter l (execl, execlp, and execle) accept the argument list using the C language’s varargs mechanism. Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.68
  69. CCáácc hhààmm execexec ()() Phân tích tên gọicáchàmexec () Hàm có chứakítự v (execv, execvp, execve) accept the argument list for the new program as a NULL-terminated array of pointers to strings. Functions that contain the letter l (execl, execlp, and execle) accept the argument list using the C language’s varargs mechanism. Functions that contain the letter p in their names (execvp and execlp) accept a program name and search for a program by that name in the current execution path; functions that don’t contain the p must be given the full path of the program to be executed. Functions that contain the letter e in their names (execve and execle) accept an additional argument, an array of environment variables.The argument should be a NULL-terminated array of pointers to character strings. Each character string should be of the form “VARIABLE=value” Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.69
  70. CCáácc hhààmm execexec ()() Phân tích tên gọicáchàmexec () Hàm có chứakítự v (execv, execvp, execve) accept the argument list for the new program as a NULL-terminated array of pointers to strings. Functions that contain the letter l (execl, execlp, and execle) accept the argument list using the C language’s varargs mechanism. Functions that contain the letter p in their names (execvp and execlp) accept a program name and search for a program by that name in the current execution path; functions that don’t contain the p must be given the full path of the program to be executed. Functions that contain the letter e in their names (execve and execle) accept an additional argument, an array of environment variables.The argument should be a NULL-terminated array of pointers to character strings. Each character string should be of the form “VARIABLE=value” Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.70
  71. TTóómm ttắắtt vvềề ccáácc hhààmm execexec ()() Library Call Argument Pass Current Set of Search of Name Format Environment PATH Variables? Automatic? execl( ) list yes no execv( ) array yes no execle( ) list no no execve( ) array no no execlp( ) list yes yes execvp( ) array yes yes Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.71
  72. VVíí ddụụ Ví dụ execlp( ) #include #include void main() { execlp("/sbin/ifconfig","/sbin/ifconfig","-a",0); } Dịch và chạy: $gcc ex1.c –o ex1 $./ex1 eth0 Link encap:Ethernet HWaddr 00:60:8C:84:E6:0E Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.72
  73. VVíí ddụụ Ví dụ execv( ) #include #include void main(int argc, char *argv[]) { execv("/sbin/ifconfig",argv); } Dịch và chạy: $gcc ex2.c –o ex2 $./ex2 -a eth0 Link encap:Ethernet HWaddr 00:60:8C:84:E6:0E Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.73
  74. VVíí ddụụ #include child_argv[2] = argv[1]; #include child_argv[3] = 0; #include execve("/bin/sh", child_argv, environ); extern char environ; exit(127); int main(int argc, char argv) { } int pid, status; do { char *child_argv[4]; if (waitpid(pid, &status, 0) == -1) { if (argc == 1) if (errno != EINTR) return 1; pid = fork(); return -1; if (pid == -1) } else return -1; return status; if (pid == 0) { } while(1); child_argv[0] = "sh"; return 0; child_argv[1] = "-c"; } Khoa Công nghệ Thông tin - Đại học Bách Khoa Tp. HCM 2.74