860 likes | 1.05k Views
Thực hành Unix, Linux (2) Ngô Thanh Nguyên Bộ môn Hệ thống và Mạng máy tính Khoa Khoa học và kỹ thuật máy tính Email: ntnguyen@cse.hcmut.edu.vn. Nội dung. Biên dịch và thực thi chương trình C/C++ Cơ bản về process Tổ chức của một process
E N D
Thực hành Unix, Linux (2) Ngô Thanh Nguyên Bộ môn Hệ thống và Mạng máy tính Khoa Khoa học và kỹ thuật máy tính Email: ntnguyen@cse.hcmut.edu.vn Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Nội dung • BiêndịchvàthựcthichươngtrìnhC/C++ • Cơ bản về process • Tổ chức của một process • Background và foreground process • Các lệnh thao tác với process • Lập trình với process • Sử dụng Makefile Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Nội dung • BiêndịchvàthựcthichươngtrìnhC/C++ • Giớithiệuvề process • Cơbảnvề process • Background và foreground process • Cáclệnhthaotácvới process • Lậptrìnhvới process • Sử dụng Makefile Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Quá trình tạo process Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Bộcôngcụpháttriểnứngdụng GNU • 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ỗi: gdb • Trìnhtiệníchkháctrongbinutilsnhưnm, strip, ar, objdump, ranlib(dùnglệnhinfo binutilsđểxemthêm) • Tiện ích: gmake • … Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Trìnhbiêndịch GNU C/C++ • CôngcụdùngbiêndịchcácchươngtrìnhC/C++ • Quátrìnhbiêndịchthànhfile thựcthigồm4 giaiđoạntheothứtựnhưsau: • preprocessing (tiềnxửlý) • compilation (biêndịch) • assembly (hợpdịch) • linking (liênkết) • Babước1, 2, 3 chủyếulàmviệcvớimộtfile đầuvào • Bước4 cóthểliênkếtnhiềuobject module liênquanđểtạothànhfile thựcthinhịphân(executable binary) • Lậptrìnhviêncóthểcan thiệpvàotừngbướcởtrên Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
GNU C/C++ compiler (gcc/g++) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Tómtắtmộtsốtùychọncủagcc Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Biên dịch chương trình C/C++ File main.c #include <stdio.h> #include "reciprocal.h" int main (intargc, char **argv) { inti; i = atoi(argv[1]); printf("The reciprocal of %d is %g\n“,i,reciprocal(i)); return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Biên dịch chương trình C/C++ File reciprocal.h extern double reciprocal(inti); File reciprocal.c #include <assert.h> /* some debug routines here */ #include "reciprocal.h" double reciprocal(inti){ assert (i != 0); /* used for debugging */ return 1.0/i; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Biên dịch chương trình C/C++ • Biêndịch(khônglink) mộtfile chươngtrìnhnguồnC đơnlẻ gcc -c main.c • Kếtquảlà object file tênmain.o • Biêndịch(khônglink) file chươngtrìnhnguồnC++ g++ -c myprog.cpp • Kếtquảlà file object tênlàmyprog.o • Biêndịch(khônglink) cósửdụngcácfile *.h trongthưmụcinclude/ gcc -c -I ../include reciprocal.c • Biêndịch(khônglink) cótốiưumã gcc -c -O2 main.c • Biêndịchcókèmthôngtin phụcvụdebug => kíchthướcfile output lớn gcc -g reciprocal.c Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Biên dịch chương trình C/C++ • Liênkết(link)nhiềufile đốitượng(object files) đãcó g++ -o myappmain.oreciprocal.o gcc -o myappmain.oreciprocal.o • Tênfile tạoralàgì? Chobiếtquyềnhạntrênfile đó? • Thựcthitạidấunhắclệnh: $./myapp 3 • Liênkếtobject files vớicácthưviện(libraries) khác • LiênkếtvớithưviệnchuẩnPOSIX pthread(/usr/lib/libpthread.so) gcc -o myappmain.o –lpthread • Liênkếtvớithưviệnlibutility.aởthưmục/usr/local/lib/somelib gcc -o myappmain.o -L/usr/local/lib/somelib –lutility • Liênkếtvớithưviệnlibtest.soởthưmụclàmviệchiệnhành gcc -o myappmain.o -L. -ltest Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Biên dịch chương trình C/C++ • Lưuý khibiêndịchtrongLinux • Dùngg++ nếuchươngtrìnhcóchứamãC lẫnC++ • DùnggccnếuchươngtrìnhchỉcómãC • File thựcthitạorakhôngcóđuôi.exe, .dllnhưmôitrườngWindows • Giảsửứngdụngcủabạngồmnhiềuhơnmộtfile source code, (e.g. main.cvàreciprocal.c). Đểtạothànhchươngtrìnhthựcthi, bạncóthểbiêndịchtrựctiếpbằngmộtlệnhgccnhưsau: gcc -o myappmain.creciprocal.c • Cáchlàmthủcôngnhưtrênsẽbấttiệnvàkhônghiệuquảkhiứngdụnggồmquánhiềufile (khoảng>10 files ???) • ThamkhảothêmcôngcụrấthữuíchlàGNU make Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Thư viện lập trình trong Linux Chobiếtưuvàkhuyếtđiểmcủastatically vs. dynamically linking? Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
ThưviệnlậptrìnhtrongLinux Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Các loại thư viện lập trình • Thưviệnliênkếttĩnh (static library) • Làtậphợpcácfile object tạothànhmộtfile đơnnhất • Tươngtựfile .LIB trênWindows • Khibạnchỉđịnhliênkếtứngdụngcủamìnhvớimộtstatic library thìlinker sẽtìmtrongthưviệnđóđểtríchxuấtnhữngfile object màbạncần. Sauđó, linker sẽtiếnhànhliênkếtcácfile object đóvàochươngtrìnhcủabạn. • Thưviệnliênkếtđộng(dynamic, shared library) • Tươngtựthưviệndạng.DLL củaWindows • Thưmụcchứathưviệnchuẩn • /usr/lib, /lib Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Tạothưviện liên kết tĩnh • Giảsửbạncóhai file mãnguồnchứahàmlàa.cvàb.c Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Tạothưviện liên kết tĩnh • Tạothưviệntĩnhtênlàlibab.a • Biên dịch tạo các file object $gcc -c a.c b.c • Dùnglệnharđểtạothànhthưviệntĩnhtênlàlibab.a $ar cr libab.a a.o b.o • Cóthểdùnglệnhnm đểxemlạikếtquả $nm libab.a • Cóthểdùnglệnhfile đểxemfile libab.alàloạifile gì $file libab.a Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Dùng thư viện liên kết tĩnh • Tạoứngdụngđơngiảncósửdụnghàmthưviệntronga.c myapp.c int main(){ printf("Ket qua dung ham func1: %d\n", func1()); exit(0); } • Biêndịchkhôngcólink thưviệntĩnhlibab.a $gcc –o myapp myapp.c /tmp/cc2dMic1.o: In function `main': /tmp/cc2dMic1.o(.text+0x7): undefined reference to `func1' collect2: ld returned 1 exit status • Biêndịchcólink đếnthưviệntĩnhlibab.a $gcc -o myappmyapp.c -L. -labhoặc $gcc -o myappmyapp.clibab.a $./myapp Ket qua dung ham func1: 7 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Tạo thư viện liên kết động • Tạothưviệnliênkếtđộnglibab.sotừa.cvàb.c • 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 • Tạothưviệnliênkếtđộngtênlàlibab.so $gcc -shared –fPIC -o libab.so a.o b.o • Cóthểdùnglệnhfile đểxemfile libab.solàloạifile gì $file libab.so libab.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Dùng thư viện liên kết động • Tạoứngdụngvớifile myapp.cnhưvídụtrước • Biêndịchkhônglink vớithưviệnđộnglibab.so $gccmyapp.c /tmp/cc2dMic1.o: In function `main’: /tmp/cc2dMic1.o(.text+0x7): ndefined reference to ‘func1' collect2: ld returned 1 exit status • Biêndịchcólink đếnthưviệnđộnglibab.so $ gcc -o myappmyapp.c -L. -lab hoặc$gcc -o myappmyapp.clibab.so $./myapp ./myapp: error while loading shared libraries: libab.so: cannot open shared object file: No such file or directory Tạisao??? Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Dùng thư viện liên kết động • Nguyênnhân: do loader tìmtrongthưmụcthưviệnchuẩnnhư/usr/lib, /lib khôngcólibab.so!!! • Cáchgiảiquyết(cũnglàcáchdùngđểtriểnkhai, mộtứngdụngcósửdụngthưviệnliênkếtđộng) • Nếucóđủquyềnhạn(e.g. root) thìcopy cácfile thưviệnchiasẻvào thưmụcchuẩn #cp libab.so /lib $./myapp Ket qua dung ham func1: 7 • Nếukhôngcóđủquyềnhạncopy file vàothưmụcchuẩn, user phảithayđổibiếnmôitrườngLD_LIBRARY_PATH đểchỉcholoader tìmtrongthưmụcchứathưviện. $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. $./myapp Ket qua dung ham func1: 7 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Dùng thư viện liên kết động • Mộtsốchúý khilậptrìnhvớithưviệnliênkếtđộng • Kiểmtraxemứngdụngcuốicùngcủamìnhtạoraphụthuộcvàocácthưviệnliênkếtđộngnàobằnglệnhldd. Nếubịthiếuthưviệnthìphảikhắcphụctheo2 cáchởtrên $lddmyapp libab.so=>not found libc.so.6=>/lib/i686/libc.so.6(0x42000000) /lib/ld-linux.so.2 (0x40000000) • Trongthưmụchiệntạicó2thưviệnlàlibab.avàlibab.so. Khiđó, linker sẽưutiênliênkếtthưviện.so trước. Muốnchỉđịnhbuộclinker tiếnhànhliênkếttĩnhvớithưviệnlibab.athìthêmtùychọn–static $mvlibab.solibab.so.old $gcc –static –o myappmyapp.c –L. –lab $./myapp Ket qua dung ham func1: 7 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Nội dung • BiêndịchvàthựcthichươngtrìnhC/C++ • Giớithiệuvề process • Cơbảnvề process • Background và foreground process • Cáclệnhthaotácvới process • Lậptrìnhvới process • Sử dụng Makefile Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Cơ bản về process • Process:chươngtrìnhđangthựcthi. • User cóthểtheodõitrạngtháicủaprocess, tươngtácvớiprocess • Có hai loại user process trong hệ thống • Foreground process • Background process • Các“process”thựchiệncáccôngviệccủahệđiềuhànhcòngọilàcáckernel_thread, daemon Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Theo dõi các process • Xem trạng thái các process (process status) ps [option] • Options • -e chọn tất các process • -f liệt kê tất cả (full) các thuộc tính • -A liệt kê tất cả processs • … Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Background và foreground process • Background process • Không có giao diện • Không thể tương tác trực tiếp với chương trình • Chạy nhiều process cùng lúc • Foreground process • Có giao diện • Tương tác trực tiếp với chương trình • Chờ process kết thúc mới chạy được process khác Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Thực thi foreground process • Khigõlệnhtươngứngvớitênchươngtrìnhtheocáchthôngthường • Khiclick vàoicon trêngiaodiệnđồhoạtươngứngvớichươngtrình. • Foreground process tươngtácđượcvớingườidùngqua thiếtbịnhậpchuẩnlàbànphím. • Kếtxuấtcủachươngtrìnhchủyếulàthiếtbịxuấtchuẩnlàmànhình. • Trình thông dịch lệnh sẽ bị blocked cho tới khi foreground process kếtthúc Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Kết thúc thực thi foreground process • Dùng tổ hợp phím Ctrl-C • Ví dụ $find / -name “*.ps” -print ... ... ^C Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Tạm hoãn thực thi foreground process • Dùng tổ hợp phím: Ctrl-Z • Process tươngứngchuyểnsang trạngtháisuspended • 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 KH&KTMT - Đại học Bách Khoa Tp. HCM
Tạm hoãn thực thi foreground process (2) • Saukhibịtạmhoãnthựcthibằng^Z, chúngtacóthểdùnglệnhpsđểxem. Mộtlệnhtiệníchkháchiểnthịthôngtin nàylàjobs • Nếumuốnchoprocess tiếptụcthựcthi ở chế độ foreground, dùnglệnhfgn (trongđón làchỉsốcủajob hiểnthịtrongngoặcvuông, vídụ[1], [4],…), cònmuốnprocess thựcthi ở chế độ background thìdùnglệnhbg n. • Ví dụ $ jobs [1]+ Stopped find / “*.profile” –print $ fg 1 hoặc $ bg 1 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Thực thi process ở background • Thêm dấu & (ampersand) vào cuối lệnh • Ví dụ $find /home/l* -name *.profile –print > kq& [1] 2548 • Trìnhthôngdịchlệnhtạoramộtprocess tươngứngvớichươngtrìnhđóđồngthờiin rajob number ([n]) vàPID (Process Identifier) củaprocess đượctạora. • Ngaysaukhithựcthi, trìnhthôngdịchsẵnsàngnhậnlệnhmới(khôngbịblocked nhưđốivớiforeground process) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Thực thi background process • Background process vẫn xuất kết quả ra standard output là màn hình trong lúc thực thi => cầntáiđịnhhướngstandard output đểtránhmấtdữliệuxuất. • Ngườidùngkhôngthểtươngtácvớichươngtrìnhqua standard inputlàbànphímvớibackground proces => cầnphảitáiđịnhhướngstandard inputthôngqua file nếuprocess đócầnnhậpdữliệu. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Quản lý background process • Liệtkêcácjob đanghoạtđộng–dùnglệnhjobs $ jobs -l [1]+ 3584 Running xterm-g 90x55 [2]- 3587 Running xterm-g 90x55 • Đối với các quá trình, có thể: • Cóthểchuyểnprocess từthựcthibackground sang foreground vàngượclạidùnglệnhfghoặcbg • Kết thúc một quá trình (~ một job) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Chuyển foreground thành background process • Trìhoãnquátrìnhđó(bằngCtrl + Z) • Dùnglệnhbg(background) đểchuyểnprocess sang chếđộthựcthibackground. • Ví dụ $ls –R / > kq ... ^Z [1]+ Stopped ls –R / >kq $bg (vì chỉ có một jobs nên bg không cần tham số) [1]+ ls –R / > kq& Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Chuyển background thành foreground process • Dùng lệnh fg fg job_number (Nếu chỉ có một quá trình chạ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 KH&KTMT - Đại học Bách Khoa Tp. HCM
Kết thúc quá trình • Dùng lệnh kill kill [-signal] process_identifier (PID) • CầndùnglệnhpstrướcđểbiếtPID củaquátrình. • Cóthểdùnglệnhđơngiảnnhưsau: kill process_identifier or kill -9 process_identifier Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Nội dung • BiêndịchvàthựcthichươngtrìnhC/C++ • Giớithiệuvề process • Cơbảnvề process • Background và foreground process • Cáclệnhthaotácvới process • Lậptrìnhvới process • Sử dụng Makefile Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Lập trình với process • Nội dung • Kiến trúc hệ thống *NIX • Tổ chức của process • Xử lý tham số dòng lệnh (command line arguments) • Tạo mới và kết thúc process • Gọithựcthilệnh/chươngtrìnhkhácbằngsystem(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Lập trình với process • Nội dung • Kiến trúc hệ thống *NIX • Tổ chức của process • Xử lý tham số dòng lệnh (command line arguments) • Tạo mới và kết thúc process • Gọithựcthilệnh/chươngtrìnhkhácbằngsystem(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Sơ lược về *NIX • Đơnkhối(monolithic) • Đa nhiệm (multitasking) • Nhiềungườidùngđồngthời(multiuser) • Đa dụng (general purpose) • Chia sẻ thời gian (time-sharing) • Bảo mật Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Một số nhánh phát triển • 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 KH&KTMT - Đại học Bách Khoa Tp. HCM
Kiến trúc tổng quan Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Kiến trúc luận lý Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
*NIX Kernel Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Kernel vs. user space Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Lập trình với process • Nội dung • Kiến trúc hệ thống *NIX • Tổ chức của process • Xử lý tham số dòng lệnh (command line arguments) • Tạo mới và kết thúc process • Gọithựcthilệnh/chươngtrìnhkhácbằngsystem(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Quản lý các quá trình • Đa nhiệm • Tác vụ -> process. • Mỗi process có: • Khônggianđịachỉ(address space) • Code thực thi • Các vùng chứa dữ liệu • Stack • Trạng thái process: • registers, program counter, stack pointer, …. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Danh định của process • Process identifier (PID) duynhất, tăngdầntừ0 • MộtsốPID đặcbiệt: • 0: root • 1: init • … Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Bộ nhớ của process • Text: chứachươngtrình–code thựcthi-chứacácinstruction dànhchoCPU thựchiện-read only. • Data: vùngdữliệu-chứacácbiếnđượckhaibáotĩnhhoặcđộng–xincấppháttronglúcthựcthi. • Stack: chứatrạngtháivàcácthôngtin liênquanđếnviệcgọihàm. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM