SlideShare a Scribd company logo
1 of 89
Download to read offline
Thực hành Unix, Linux (2)
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
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
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
 Background và foreground process
 Các lệnh thao tác với process
 Lập trình với process
2Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Nội dung
 Biên dịch và thực thi chương trình C/C++
 Giới thiệu về process
 Cơ bản về process
 Background và foreground process
 Các lệnh thao tác với process
 Lập trình với process
3Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Quá trình tạo process
4Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
source
file 1
source
file 2
source
file 3
object
module 1
object
module 2
object
module 3
Compiler Linker
Loader
executable
file
process
image
.c .cc .cpp .o
gcc/g++ gcc/g++
Bộ công cụ phát triển ứng
dụng GNU
 GNU Compiler Collection (GCC)
 Thư viện các hàm tiện ích: libc, libstdc++, …
 Các trình biên dịch: gcc, g++, gcj, gas, …
 Trình khử lỗi: gdb
 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 KH&KTMT - Đại học Bách Khoa Tp. HCM 5
Trình biên dịch GNU 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ực thi gồm 4 giai đoạn theo thứ
tự như sau:
1. preprocessing (tiền xử lý)
2. compilation (biên dịch)
3. assembly (hợp dịch)
4. linking (liên kết)
 Ba bước 1, 2, 3 chủ yếu làm việc với một file đầu vào
 Bước 4 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ập trình viên có thể can thiệp vào từng bước ở trên
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 6
GNU C/C++ compiler (gcc/g++)
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 7
.c,.cc
.cpp
.s
hello.o
a.o b.o
source code
preprocessed
source file
assembly
source code
object file
hello.c
gcc –E hello.c [–o hello.cpp]
hello.cpp
gcc –x cpp-output –S hello.cpp [–o hello.s]
hello.s
gcc –x assembler –c hello.s [–o hello.o]
gcc a.o b.o hello.o [–o hello]
gcc –S hello.c [–o hello.s]
gcc –c hello.c [–o hello]
gcc hello.c [–o hello]
Tóm tắt một số tùy chọn của
gcc
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 8
Biên dịch chương trình C/C++
File main.c
#include <stdio.h>
#include "reciprocal.h"
int main (int argc, char **argv)
{
int i;
i = atoi(argv[1]);
printf("The reciprocal of %d is %gn‚,i,reciprocal(i));
return 0;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 9
Biên dịch chương trình C/C++
File reciprocal.h
extern double reciprocal(int i);
File reciprocal.c
#include <assert.h> /* some debug routines here */
#include "reciprocal.h"
double reciprocal(int i){
assert (i != 0); /* used for debugging */
return 1.0/i;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 10
Biên dịch chương trình C/C++
 Biên dịch (không link) một file chương trình nguồn C
đơn lẻ
gcc -c main.c
 Biên dịch (không link) có sử dụng các file *.h trong thư
mục include
gcc -c -I ../include reciprocal.c
 Biên dịch (không link) có tối ưu mã
gcc -c -O2 main.c
 Biên dịch có kèm thông tin phục vụ debug => kích thước
file output lớn
gcc –g -c reciprocal.c
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 11
Biên dịch chương trình C/C++
 Liên kết (link) nhiều file đối tượng (object files) đã có
gcc -o myapp main.o reciprocal.o
 Liên kết object files với các thư viện (libraries) khác
gcc -o myapp main.o –lpthread
gcc -o myapp main.o -L/usr/somelib –lutil
gcc -o myapp main.o -L. -ltest
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 12
Biên dịch chương trình C/C++
 Lưu ý khi biên dịch trong Linux
 Dùng g++ nếu chương trình có chứa mã C lẫn C++
 Dùng gcc nếu chương trình chỉ có mã C
 File thực thi tạo ra không có đuôi .exe, .dll như môi trường
Windows
 Giả sử ứng dụng của bạn gồm nhiều hơn một file source code,
(e.g. main.c và reciprocal.c). Để tạo thành chương trình thực
thi, bạn có thể biên dịch trực tiếp bằng một lệnh gcc như sau:
$ gcc -o myapp main.c reciprocal.c
 Cách làm thủ công như trên sẽ bất tiện và không hiệu quả khi
ứng dụng gồm quá nhiều file (khoảng>10 files ???)
 Tham khảo thêm công cụ rất hữu ích là GNU make
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 13
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 14
source
file 1
source
file 2
source
file 3
object
module 1
object
module 2
object
module 3
Compiler Linker
Loader
executable
file
process
image
static
libraries
dynamic
libraries
static linking
dynamic linking
Thư viện lập trình trong Linux
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 15
Các loại thư viện lập trình
 Thư viện liên kết tĩnh (static library)
 Là tập hợp các file object tạo thành một file đơn nhất
 Tương tự file .LIB trên Windows
 Khi bạn chỉ định liên kết ứng dụng của mình với một static
library thì linker sẽ tìm trong thư viện đó để trích xuất
những file object mà bạn cần. Sau đó, linker sẽ tiến hành
liên kết các file object đó vào chương trình của bạn.
 Thư viện liên kết động (dynamic, shared library)
 Tương tự thư viện dạng .DLL của Windows
 Thư mục chứa thư viện chuẩn
 /usr/lib, /lib
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 16
Tạo thư viện liên kết tĩnh
 Giả sử bạn có hai file mã nguồn chứa hàm là a.c và b.c
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 17
a.c b.c
int func1(){
return 7;
}
double func2(){
return 3.14159;
}
Tạo thư viện liên kết tĩnh
 Tạo thư viện tĩ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ện tĩnh tên là libab.a
$ ar cr libab.a a.o b.o
3. Có thể dùng lệnh nm để xem lại kết quả
$ nm libab.a
4. Có thể dùng lệnh file để xem file libab.a là loại file gì
$ file libab.a
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 18
Dùng thư viện liên kết tĩnh
 Tạo ứng dụng có sử dụng hàm thư viện trong a.c
myapp.c
int main(){
printf("Ket qua ham func1: %dn‛,func1());
exit(0);
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 19
Dùng thư viện liên kết tĩnh
 Biên dịch không link đến thư viện tĩnh libab.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ên dịch có link đến thư viện tĩnh libab.a
$ gcc -o myapp myapp.c -L. -lab hoặc
$ gcc -o myapp myapp.c libab.a
$ ./myapp
Ket qua dung ham func1: 7
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 20
Tạo thư viện liên kết động
 Tạo thư viện liên kế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ạo thư viện liên kế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 KH&KTMT - Đại học Bách Khoa Tp. HCM 21
Dùng thư viện liên kết động
 Biên dịch không link đến thư viện động libab.so
$ 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ên dịch có link đến thư viện động libab.so
$ 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
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 22
Dùng thư viện liên kết động
 Nguyên nhân: do loader tìm trong thư mục thư viện chuẩn
như /usr/lib, /lib không có libab.so
 Cách giải quyết
# cp libab.so /lib
$ ./myapp
Ket qua dung ham func1: 7
hoặc
$ 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 23
Dùng thư viện liên kết động
 Một số chú ý khi lập trình với thư viện liên kết động
 Kiểm tra xem ứng dụng cuối cùng của mình tạo ra phụ
thuộc vào các thư viện liên kết động nào bằng lệnh ldd. Nếu
bị thiếu thư viện thì phải khắc phụ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 (0x40000000)
 Trong thư mục hiện tại có 2 thư viện là libab.a và libab.so.
Khi đó, linker sẽ ưu tiên liên kết thư viện .so trước. Muốn
chỉ định buộc linker tiến hành liên kết tĩnh với thư viện
libab.a thì thêm tùy chọn –static
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 24
Nội dung
 Biên dịch và thực thi chương trình C/C++
 Giới thiệu về process
 Cơ bản về process
 Background và foreground process
 Các lệnh thao tác với process
 Lập trình với process
25Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
Cơ bản về process
 Process: chương trình đang thực thi.
 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 trong hệ thống
 Foreground process
 Background process
 Các “process” thực hiện các công việc của hệ điều hành
còn gọi là các kernel_thread, daemon
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 26
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 27
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 28
Thực thi foreground process
 Khi gõ lệnh tương ứng với tên chương trình theo cách
thông thường
 Khi click vào icon trên giao diện đồ hoạ tương ứng với
chương trình.
 Foreground process tương tác được với người dùng qua
thiết bị nhập chuẩn là bàn phím.
 Kết xuất của chương trình chủ yếu là thiết bị xuất chuẩn là
màn hì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 29
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 30
Tạm hoãn thực thi foreground
process
 Dùng tổ hợp phím Ctrl-Z
Process tương ứng chuyển sang 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 KH&KTMT - Đại học Bách Khoa Tp. HCM 31
Tạm hoãn thực thi foreground
process (2)
 Nếu muốn cho process tiếp tục thực thi ở chế độ
foreground, dùng lệnh fg n (trong đó n là chỉ số của job
hiển thị trong ngoặc vuông, ví dụ [1], [4], …), còn muốn
process thực thi ở chế độ background thì dùng lệnh bg 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 32
Thực thi process ở
background
 Thêm dấu & (ampersand) vào cuối lệnh
 Ví dụ
$ find / ‚*.profile‛ -print > kq&
[1] 2548
 Trình thông dịch lệnh tạo ra một process tương ứng với
chương trình đó đồng thời in ra job number và PID của
process được tạo ra.
 Ngay sau khi thực thi, trình thông dịch sẵn sàng nhận lệnh
mới (không bị blocked như đối với foreground process)
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 33
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ần tái định hướng standard output để tránh mất dữ liệu
xuất.
 Người dùng không thể tương tác với chương trình qua
standard input là bàn phím
=> cần phải tái định hướng standard input thông qua file nếu
process đó cần nhập dữ liệu.
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 34
Quản lý background process
 Liệt kê các job đang hoạt động – dùng lệnh jobs
$ jobs -l
[1]+ 3584 Running xterm-g 90x55
[2]- 3587 Running xterm-g 90x55
 Đối với các quá trình, có thể:
 Chuyển process từ thực thi background sang foreground và
ngược lại dùng lệnh fg hoặc bg
 Kết thúc một quá trình
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 35
Chuyển foreground thành
background process
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ần tham số)
[1]+ ls –R / > kq&
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 36
Chuyển background thành
foreground process
 Dùng lệnh fg (foreground)
 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 37
Kết thúc quá trình
 Dùng lệnh kill
kill [-signal] process_identifier
 Cần dùng lệnh ps trước để biết PID của quá trình.
 Có thể dùng lệnh đơn giản như sau:
kill process_identifier hoặc
kill -9 process_identifier
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 38
Nội dung
 Biên dịch và thực thi chương trình C/C++
 Giới thiệu về process
 Cơ bản về process
 Background và foreground process
 Các lệnh thao tác với process
 Lập trình với process
39Khoa 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ọi thực thi lệnh/chương trình khác bằng system(), exec…()
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 40
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ọi thực thi lệnh/chương trình khác bằng system(), exec…()
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 41
Sơ lược về *NIX
 Đơn khối (monolithic)
 Đa nhiệm (multitasking)
 Nhiều người dùng đồng thờ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 42
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 43
Kiến trúc tổng quan
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 44
Kiến trúc luận lý
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 45
*NIX Kernel
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 46
Kernel vs. user space
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 47
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ọi thực thi lệnh/chương trình khác bằng system(), exec…()
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 48
Quản lý các quá trình
 Đa nhiệm
 Tác vụ -> process.
 Mỗi process có:
 Không gian địa chỉ (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 49
Danh định của process
 Process identifier (PID) duy nhất, tăng dần từ 0
 Một số PID đặc biệt:
 0: root
 1: init
 …
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 50
Bộ nhớ của process
 Text: chứa chương trình – code thực thi - chứa các
instruction dành cho CPU thực hiện - read only.
 Data: vùng dữ liệu - chứa các biến được khai báo tĩnh
hoặc động – xin cấp phát trong lúc thực thi.
 Stack: chứa trạng thái và các thông tin liên quan đến việc
gọi hàm.
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 51
Cấu trúc bộ nhớ
 Process memory layout:
 Text segment (code)
 Data segment
 Stack
 Heap
 Command-line arguments
 Environment variables
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 52
Cấu trúc bộ nhớ
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 53
Địa chỉ bộ nhớ
 Địa chỉ do process tham khảo chỉ là địa chỉ ảo
 Có thể truy xuất thông tin bộ nhớ qua các biến toàn cục:
 etext: địa chỉ sau vùng text
 edata: địa chỉ kết thúc vùng initialized data
 end: địa chỉ bắt đầu vùng heap
 Định nghĩa macro để in địa chỉ một biến
#define PADDR(x) printf(#x " at %un", &x)
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 54
#include <stdio.h>
#include <stdlib.h>
#define PADDR(x) printf(#x " at %un", &x);
extern unsigned etext, edata, end;
int a = 0, b;
int main(int argc, char *argv[]) {
printf("End of text seqment at %un", &etext);
printf("End of initialized statics and externals at
%un", &edata);
printf("End of uninitialized statics and externals at
%un", &end);
PADDR(a);
PADDR(b);
return 0;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 55
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ọi thực thi lệnh/chương trình khác bằng system(), exec…()
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 56
Lấy đối số và biến môi trường
 Chương trình C
int main(int argc, char *argv[]) {
}
 Trong đó
 int argc: số tham số của chương trình khi chạy
 char *argv[]: danh sách các tham số
 Ngoài ra, còn có các biến ngoại (external variable)
 extern char **environ: danh sách biến môi trường
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 57
Lấy đối số và biến môi trường
 Gọi thực thi chương trình myapp:
$ ./myapp 12 34 56 78
The biggest integer is 78
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 58
5 ./myapp
12
34
56
78
argc argv
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
int main(int argc, char *argv[]) {
int i;
printf(‚Number of arguments is %dn",argc);
printf(‚Arguments:n");
for(i=0; i<argc; i++)
printf("argv[%d]=%sn",i,argv[i]);
getchar();
for (i=0; environ[i]!=(char *)0; i++)
printf("%sn",environ[i]);
return 0;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 59
Lấy PID của process
#include <unistd.h>
pid_t getpid(void);
Lấy PID của process hiện hành
pid_t getppid(void);
Lấy PID của process cha
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 60
Ví dụ
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Processid: %dn", getpid());
printf("Parent process id: %dn", getppid());
return 0;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 61
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ọi thực thi lệnh/chương trình khác bằng system(), exec…()
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 62
Tạo process
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 63
Parent
Child
fork()
Tạo process
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 64
Parent process
Text
Data
Stack Parent process
Text
Data
Stack
fork()
Chu kỳ sống của process
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 65
Parent
Child Child Zombie
Parent
fork()
wait()
exec() exit()
Tạo process
 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ếu thất bại, trả về -1 và lý do kèm theo:
 ENOMEM: không đủ bộ nhớ
 EAGAIN: số process vượt quá giới hạn cho phép
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 66
Ví dụ
 Dạng mẫu chươ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 KH&KTMT - Đại học Bách Khoa Tp. HCM 67
#include <stdio.h>
#include <unistd.h>
int main() {
int pid;
if ((pid=fork())==0) {
printf("Child process output: PID=%dn",getpid());
printf("My parent PID is %dnn",getppid());
}else if(pid>0) {
printf("Parent process output: PID=%dn‚,getpid());
printf("Child PID=%dn‚,pid);
}else {
printf("Fork error!n");
exit(1);
}
return 0;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 68
Kết thúc process
 Dùng system call exit()
 Orphaned process: process cha kết thúctrước -> process
con sau đó sẽ có cha là init (PID=1)
 Zombied process
 Process kết thúc nhưng chưa báo trạng thái cho process cha
biết.
 Dùng hàm wait() hay waitpid() ở process cha để lấy trạng
thái trả về từ process con.
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 69
Đợi process con
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *stat_loc, int options);
Trả về PID của process con thay đổi trạng thái, hoặc -1 nếu thất bại
Đối số pid:
< -1: Đợi bất kỳ process con nào có process group ID bằng với |pid|
= -1: Đợi bất kỳ process con nào
= 0: Đợi bất kỳ process con nào có process group ID bằng với process
group ID của process gọi.
> 0: Đợi pocess có PID bằng với giá trị này
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 70
Đợi process con
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *stat_loc);
Tham khảo manpage của system call waitpid(), wait()
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 71
Ví dụ
#include <stdio.h>
#include <unistd.h>
#define PROCESSNUM 3 /* Number of processes */
int main(int argc, char *argv[]) {
int count, retval, child_no;
/* Creating processes */
retval=1;
for (count=0; count<PROCESSNUM; count++) {
if (retval!=0) retval=fork();
else break;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 72
/* Execution of child processes */
if (retval==0) {
child_no=count;
printf("Child #%d has PID: #%dn‛, child_no,getpid());
sleep(rand()%5);
} else {
/* Waiting for children termination */
for (count=0; count<PROCESSNUM; count++)
wait(NULL);
printf(‚Parent has PID (process-id): #%dn‛, getpid());
}
return 0;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 73
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ọi thực thi lệnh/chương trình khác bằng system(), exec…()
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 74
Các hàm gọi thực thi chương
trình
 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 KH&KTMT - Đại học Bách Khoa Tp. HCM 75
Hàm system()
 Xử lý một lệnh được chỉ ra trong thông số string và trả về
sau khi lệnh được thực thi xong
 Thực chất thì lời gọi hàm system(string) sẽ thực hiện lệnh
sh -c string
 Giá trị trả về:
 0: thành công
 -127: mã lỗi không khởi động shell để thực hiện lệnh
 -1: mã lỗi khác
 <> -1: mã trả về khi thực hiện lệnh string
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 76
Hàm system()
 Ví dụ
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
if(!system("ls -l /"))
printf("Call system() OK!n");
return 0;
}
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 77
Các hàm exec…()
 Các hàm exec…() thực hiện như sau:
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 78
$ command
fork produces a child
process
execve, overlay child process
image with command image
Command has finished,
exit, return, etc.
$ prompt returns
Shell waits for the
command to finish
command
executes
Các hàm exec…()
 Chú ý
 Các hàm exec sẽ thay thế process gọi hàm bằng chương trình
tương ứng trong tham số nhập của hàm. Vùng text, data, stack bị
thay thế, vùng user (user area) không bị thay thế.
 Chương trình được gọi bắt đầu thực thi ở hàm main() (entry
point), có thể nhận tham số nhập thông qua các tham số truyền
vào các hàm exec.
 Ví dụ
 Gọi thực thi lệnh ở dấu nhắc
$ ls -l /
 Chương trình dùng exec…()
execl(‚/bin/ls‛,‚/bin/ls‛,‚-l‛, ‚/‛, (char*)0);
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 79
Phân tích tên gọi các hàm
exec…()
 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 KH&KTMT - Đại học Bách Khoa Tp. HCM 80
Phân tích tên gọi các hàm
exec…()
 Hàm có chứa kí tự l (execl, execlp, execle) dùng danh sách
tham số là các pointer đến string, kết thúc danh sách này là
một NULL pointer.
 Hàm có chứa kí tự v (execv, execvp, execve) dùng danh
sách tham số là một array các pointer đến string, kết thúc là
một NULL pointer.
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 81
Phân tích tên gọi các hàm
exec…()
 Hàm có chứa kí tự p (execlp, execvp) chấp nhận tên của
chương trình cần chạy, khi chạy chương trình đó, nó sẽ
tìm trong execution path hiện tại; các hàm không có kí tự
p phải cung cấp đầy đủ đường dẫn đến chương trình cần
chạy.
 Hàm có chứa kí tự e (execle, execve) có thêm một thông
số khác là biến môi trường. Thông số này phải là một
pointer trỏ đến các string, và string cuối cùng của pointer
này là NULL pointer. Mỗi string mà pointer này trỏ đến có
dạng “VARIABLE=value”.
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 82
Tóm tắt tên các hàm exec…()
Tên hàm Tham số
Tự động tìm
biến môi
trường
Tự động tìm
đường dẫn
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 KH&KTMT - Đại học Bách Khoa Tp. HCM 83
Ví dụ 1
#include <stdio.h>
#include <unistd.h>
void main() {
execlp("/sbin/ifconfig","/sbin/ifconfig","-a",0);
}
 Dịch và chạy
$ gcc –o ex1 ex1.c
$ ./ex1
eth0 Link encap:Ethernet Hwaddr 00:60:8C:84:E6:0E
......
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 84
Ví dụ 2
#include <stdio.h>
#include <unistd.h>
void main(int argc, char *argv[]){
execv("/sbin/ifconfig",argv);
}
 Dịch và chạy
$gcc –o ex2 ex2.c
$./ex2 -a
eth0 Link encap:Ethernet Hwaddr 00:60:8C:84:E6:0E
…
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 85
Ví dụ 3
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 86
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
extern char **environ;
int main(int argc, char **argv) {
int pid, status;
char *child_argv[4];
if (argc==1)
return 1;
pid=fork();
Ví dụ 3 (tt)
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 87
if (pid==-1)
return -1;
if (pid==0) {
child_argv[0]=‚sh‛;
child_argv[1]=‚-c‛;
child_argv[2]=argv[1];
child_argv[3]=0;
execve(‚/bin/sh‛, child_argv, environ);
exit(127);
}
Ví dụ 3 (tt)
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 88
do {
if (waitpid(pid, &status, 0)==-1) {
if (errno!=EINTR) return -1;
} else
return status;
} while(1);
return 0;
}
Questions???
Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 89

More Related Content

What's hot

Phan2 chuong1 gioithieu_c
Phan2 chuong1 gioithieu_cPhan2 chuong1 gioithieu_c
Phan2 chuong1 gioithieu_cLy hai
 
Hacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịchHacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịchLevis Nickaster
 
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)Levis Nickaster
 
Hướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịchHướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịchLevis Nickaster
 
Reverse Engineering .NET - Advanced Patching, Playing with IL
Reverse Engineering .NET - Advanced Patching, Playing with ILReverse Engineering .NET - Advanced Patching, Playing with IL
Reverse Engineering .NET - Advanced Patching, Playing with ILLevis Nickaster
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoBác Luân
 
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịchPhân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịchLevis Nickaster
 
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịchPhân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịchLevis Nickaster
 
Phân tích ConfuserEX - Invalid Metadata (bài dịch)
Phân tích ConfuserEX - Invalid Metadata (bài dịch)Phân tích ConfuserEX - Invalid Metadata (bài dịch)
Phân tích ConfuserEX - Invalid Metadata (bài dịch)Levis Nickaster
 
Những thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NETNhững thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NETLevis Nickaster
 

What's hot (11)

Phan2 chuong1 gioithieu_c
Phan2 chuong1 gioithieu_cPhan2 chuong1 gioithieu_c
Phan2 chuong1 gioithieu_c
 
File trong c_
File trong c_File trong c_
File trong c_
 
Hacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịchHacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịch
 
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
 
Hướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịchHướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịch
 
Reverse Engineering .NET - Advanced Patching, Playing with IL
Reverse Engineering .NET - Advanced Patching, Playing with ILReverse Engineering .NET - Advanced Patching, Playing with IL
Reverse Engineering .NET - Advanced Patching, Playing with IL
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịchPhân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
 
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịchPhân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
 
Phân tích ConfuserEX - Invalid Metadata (bài dịch)
Phân tích ConfuserEX - Invalid Metadata (bài dịch)Phân tích ConfuserEX - Invalid Metadata (bài dịch)
Phân tích ConfuserEX - Invalid Metadata (bài dịch)
 
Những thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NETNhững thuật ngữ thường gặp trong Reverse Engineering .NET
Những thuật ngữ thường gặp trong Reverse Engineering .NET
 

Viewers also liked

Portfolio- Interior Design
Portfolio- Interior DesignPortfolio- Interior Design
Portfolio- Interior DesignGwendolyn Lynn
 
Attachment_pictorial_prasad vasudevon
Attachment_pictorial_prasad vasudevonAttachment_pictorial_prasad vasudevon
Attachment_pictorial_prasad vasudevonPrasad Vasudevon
 
Melbourne zone subs unamed
Melbourne zone subs unamed Melbourne zone subs unamed
Melbourne zone subs unamed Gary Lee
 
White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...
White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...
White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...White Land Foundation
 
PMA_Roxtec_Firebarrier_solution (1) (2)
PMA_Roxtec_Firebarrier_solution (1) (2)PMA_Roxtec_Firebarrier_solution (1) (2)
PMA_Roxtec_Firebarrier_solution (1) (2)Gary Lee
 
Melbourne zone subs unamed
Melbourne zone subs unamed Melbourne zone subs unamed
Melbourne zone subs unamed Gary Lee
 

Viewers also liked (9)

IVR voip
IVR voipIVR voip
IVR voip
 
Portfolio- Interior Design
Portfolio- Interior DesignPortfolio- Interior Design
Portfolio- Interior Design
 
Attachment_pictorial_prasad vasudevon
Attachment_pictorial_prasad vasudevonAttachment_pictorial_prasad vasudevon
Attachment_pictorial_prasad vasudevon
 
Melbourne zone subs unamed
Melbourne zone subs unamed Melbourne zone subs unamed
Melbourne zone subs unamed
 
White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...
White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...
White Land Foundation Acitivities In Jezzine Year 2013 - نشاطات مؤسسة الأرض ا...
 
In Design Portfolio
In Design PortfolioIn Design Portfolio
In Design Portfolio
 
PMA_Roxtec_Firebarrier_solution (1) (2)
PMA_Roxtec_Firebarrier_solution (1) (2)PMA_Roxtec_Firebarrier_solution (1) (2)
PMA_Roxtec_Firebarrier_solution (1) (2)
 
Melbourne zone subs unamed
Melbourne zone subs unamed Melbourne zone subs unamed
Melbourne zone subs unamed
 
In Design Portfolio
In Design PortfolioIn Design Portfolio
In Design Portfolio
 

Similar to Os lab2

tài liệu Mã nguồn mở Lap trình tren linux
tài liệu Mã nguồn mở  Lap trình tren linuxtài liệu Mã nguồn mở  Lap trình tren linux
tài liệu Mã nguồn mở Lap trình tren linuxThuyet Nguyen
 
Bài giảng Lập trình mạng
Bài giảng Lập trình mạngBài giảng Lập trình mạng
Bài giảng Lập trình mạngctrl man
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệTrần Thiên Đại
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#Hihi Hung
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#LanLT2011
 
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]leduyk11
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#LanLT2011
 
Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Văn Dũng
 
Introduction to python 20110917
Introduction to python   20110917Introduction to python   20110917
Introduction to python 20110917AiTi Education
 
Buffer overflow(bao cao)
Buffer overflow(bao cao)Buffer overflow(bao cao)
Buffer overflow(bao cao)phanleson
 
1. giới thiệu về ng￴n ngữ lập trình c#
1. giới thiệu về ng￴n ngữ lập trình c#1. giới thiệu về ng￴n ngữ lập trình c#
1. giới thiệu về ng￴n ngữ lập trình c#Duy Lê Văn
 
Windows Programming Tác giả: Bộ môn Công nghệ phần mềm; Người hướng dẫn: -; ...
Windows Programming Tác giả: Bộ môn Công nghệ phần mềm;  Người hướng dẫn: -; ...Windows Programming Tác giả: Bộ môn Công nghệ phần mềm;  Người hướng dẫn: -; ...
Windows Programming Tác giả: Bộ môn Công nghệ phần mềm; Người hướng dẫn: -; ...VTrung46
 

Similar to Os lab2 (20)

Linux+03
Linux+03Linux+03
Linux+03
 
tài liệu Mã nguồn mở Lap trình tren linux
tài liệu Mã nguồn mở  Lap trình tren linuxtài liệu Mã nguồn mở  Lap trình tren linux
tài liệu Mã nguồn mở Lap trình tren linux
 
Phan 1 sv
Phan 1   svPhan 1   sv
Phan 1 sv
 
Bài giảng Lập trình mạng
Bài giảng Lập trình mạngBài giảng Lập trình mạng
Bài giảng Lập trình mạng
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất Nghệ
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
C# cơ bản hay
C# cơ bản hayC# cơ bản hay
C# cơ bản hay
 
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#Thêm sửa-xóa-combobox - c#
Thêm sửa-xóa-combobox - c#
 
Introduction to python 20110917
Introduction to python   20110917Introduction to python   20110917
Introduction to python 20110917
 
005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf
 
005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf
 
Phạm văn ất
Phạm văn ấtPhạm văn ất
Phạm văn ất
 
Buffer overflow(bao cao)
Buffer overflow(bao cao)Buffer overflow(bao cao)
Buffer overflow(bao cao)
 
1. giới thiệu về ng￴n ngữ lập trình c#
1. giới thiệu về ng￴n ngữ lập trình c#1. giới thiệu về ng￴n ngữ lập trình c#
1. giới thiệu về ng￴n ngữ lập trình c#
 
Windows Programming Tác giả: Bộ môn Công nghệ phần mềm; Người hướng dẫn: -; ...
Windows Programming Tác giả: Bộ môn Công nghệ phần mềm;  Người hướng dẫn: -; ...Windows Programming Tác giả: Bộ môn Công nghệ phần mềm;  Người hướng dẫn: -; ...
Windows Programming Tác giả: Bộ môn Công nghệ phần mềm; Người hướng dẫn: -; ...
 
Huong doi tuong
Huong doi tuongHuong doi tuong
Huong doi tuong
 

Os lab2

  • 1. Thực hành Unix, Linux (2) 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 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
  • 2. 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  Background và foreground process  Các lệnh thao tác với process  Lập trình với process 2Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
  • 3. Nội dung  Biên dịch và thực thi chương trình C/C++  Giới thiệu về process  Cơ bản về process  Background và foreground process  Các lệnh thao tác với process  Lập trình với process 3Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
  • 4. Quá trình tạo process 4Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM source file 1 source file 2 source file 3 object module 1 object module 2 object module 3 Compiler Linker Loader executable file process image .c .cc .cpp .o gcc/g++ gcc/g++
  • 5. Bộ công cụ phát triển ứng dụng GNU  GNU Compiler Collection (GCC)  Thư viện các hàm tiện ích: libc, libstdc++, …  Các trình biên dịch: gcc, g++, gcj, gas, …  Trình khử lỗi: gdb  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 KH&KTMT - Đại học Bách Khoa Tp. HCM 5
  • 6. Trình biên dịch GNU 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ực thi gồm 4 giai đoạn theo thứ tự như sau: 1. preprocessing (tiền xử lý) 2. compilation (biên dịch) 3. assembly (hợp dịch) 4. linking (liên kết)  Ba bước 1, 2, 3 chủ yếu làm việc với một file đầu vào  Bước 4 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ập trình viên có thể can thiệp vào từng bước ở trên Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 6
  • 7. GNU C/C++ compiler (gcc/g++) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 7 .c,.cc .cpp .s hello.o a.o b.o source code preprocessed source file assembly source code object file hello.c gcc –E hello.c [–o hello.cpp] hello.cpp gcc –x cpp-output –S hello.cpp [–o hello.s] hello.s gcc –x assembler –c hello.s [–o hello.o] gcc a.o b.o hello.o [–o hello] gcc –S hello.c [–o hello.s] gcc –c hello.c [–o hello] gcc hello.c [–o hello]
  • 8. Tóm tắt một số tùy chọn của gcc Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 8
  • 9. Biên dịch chương trình C/C++ File main.c #include <stdio.h> #include "reciprocal.h" int main (int argc, char **argv) { int i; i = atoi(argv[1]); printf("The reciprocal of %d is %gn‚,i,reciprocal(i)); return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 9
  • 10. Biên dịch chương trình C/C++ File reciprocal.h extern double reciprocal(int i); File reciprocal.c #include <assert.h> /* some debug routines here */ #include "reciprocal.h" double reciprocal(int i){ assert (i != 0); /* used for debugging */ return 1.0/i; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 10
  • 11. Biên dịch chương trình C/C++  Biên dịch (không link) một file chương trình nguồn C đơn lẻ gcc -c main.c  Biên dịch (không link) có sử dụng các file *.h trong thư mục include gcc -c -I ../include reciprocal.c  Biên dịch (không link) có tối ưu mã gcc -c -O2 main.c  Biên dịch có kèm thông tin phục vụ debug => kích thước file output lớn gcc –g -c reciprocal.c Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 11
  • 12. Biên dịch chương trình C/C++  Liên kết (link) nhiều file đối tượng (object files) đã có gcc -o myapp main.o reciprocal.o  Liên kết object files với các thư viện (libraries) khác gcc -o myapp main.o –lpthread gcc -o myapp main.o -L/usr/somelib –lutil gcc -o myapp main.o -L. -ltest Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 12
  • 13. Biên dịch chương trình C/C++  Lưu ý khi biên dịch trong Linux  Dùng g++ nếu chương trình có chứa mã C lẫn C++  Dùng gcc nếu chương trình chỉ có mã C  File thực thi tạo ra không có đuôi .exe, .dll như môi trường Windows  Giả sử ứng dụng của bạn gồm nhiều hơn một file source code, (e.g. main.c và reciprocal.c). Để tạo thành chương trình thực thi, bạn có thể biên dịch trực tiếp bằng một lệnh gcc như sau: $ gcc -o myapp main.c reciprocal.c  Cách làm thủ công như trên sẽ bất tiện và không hiệu quả khi ứng dụng gồm quá nhiều file (khoảng>10 files ???)  Tham khảo thêm công cụ rất hữu ích là GNU make Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 13
  • 14. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 14 source file 1 source file 2 source file 3 object module 1 object module 2 object module 3 Compiler Linker Loader executable file process image static libraries dynamic libraries static linking dynamic linking
  • 15. Thư viện lập trình trong Linux Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 15
  • 16. Các loại thư viện lập trình  Thư viện liên kết tĩnh (static library)  Là tập hợp các file object tạo thành một file đơn nhất  Tương tự file .LIB trên Windows  Khi bạn chỉ định liên kết ứng dụng của mình với một static library thì linker sẽ tìm trong thư viện đó để trích xuất những file object mà bạn cần. Sau đó, linker sẽ tiến hành liên kết các file object đó vào chương trình của bạn.  Thư viện liên kết động (dynamic, shared library)  Tương tự thư viện dạng .DLL của Windows  Thư mục chứa thư viện chuẩn  /usr/lib, /lib Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 16
  • 17. Tạo thư viện liên kết tĩnh  Giả sử bạn có hai file mã nguồn chứa hàm là a.c và b.c Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 17 a.c b.c int func1(){ return 7; } double func2(){ return 3.14159; }
  • 18. Tạo thư viện liên kết tĩnh  Tạo thư viện tĩ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ện tĩnh tên là libab.a $ ar cr libab.a a.o b.o 3. Có thể dùng lệnh nm để xem lại kết quả $ nm libab.a 4. Có thể dùng lệnh file để xem file libab.a là loại file gì $ file libab.a Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 18
  • 19. Dùng thư viện liên kết tĩnh  Tạo ứng dụng có sử dụng hàm thư viện trong a.c myapp.c int main(){ printf("Ket qua ham func1: %dn‛,func1()); exit(0); } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 19
  • 20. Dùng thư viện liên kết tĩnh  Biên dịch không link đến thư viện tĩnh libab.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ên dịch có link đến thư viện tĩnh libab.a $ gcc -o myapp myapp.c -L. -lab hoặc $ gcc -o myapp myapp.c libab.a $ ./myapp Ket qua dung ham func1: 7 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 20
  • 21. Tạo thư viện liên kết động  Tạo thư viện liên kế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ạo thư viện liên kế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 KH&KTMT - Đại học Bách Khoa Tp. HCM 21
  • 22. Dùng thư viện liên kết động  Biên dịch không link đến thư viện động libab.so $ 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ên dịch có link đến thư viện động libab.so $ 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 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 22
  • 23. Dùng thư viện liên kết động  Nguyên nhân: do loader tìm trong thư mục thư viện chuẩn như /usr/lib, /lib không có libab.so  Cách giải quyết # cp libab.so /lib $ ./myapp Ket qua dung ham func1: 7 hoặc $ 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 23
  • 24. Dùng thư viện liên kết động  Một số chú ý khi lập trình với thư viện liên kết động  Kiểm tra xem ứng dụng cuối cùng của mình tạo ra phụ thuộc vào các thư viện liên kết động nào bằng lệnh ldd. Nếu bị thiếu thư viện thì phải khắc phụ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 (0x40000000)  Trong thư mục hiện tại có 2 thư viện là libab.a và libab.so. Khi đó, linker sẽ ưu tiên liên kết thư viện .so trước. Muốn chỉ định buộc linker tiến hành liên kết tĩnh với thư viện libab.a thì thêm tùy chọn –static Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 24
  • 25. Nội dung  Biên dịch và thực thi chương trình C/C++  Giới thiệu về process  Cơ bản về process  Background và foreground process  Các lệnh thao tác với process  Lập trình với process 25Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
  • 26. Cơ bản về process  Process: chương trình đang thực thi.  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 trong hệ thống  Foreground process  Background process  Các “process” thực hiện các công việc của hệ điều hành còn gọi là các kernel_thread, daemon Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 26
  • 27. 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 27
  • 28. 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 28
  • 29. Thực thi foreground process  Khi gõ lệnh tương ứng với tên chương trình theo cách thông thường  Khi click vào icon trên giao diện đồ hoạ tương ứng với chương trình.  Foreground process tương tác được với người dùng qua thiết bị nhập chuẩn là bàn phím.  Kết xuất của chương trình chủ yếu là thiết bị xuất chuẩn là màn hì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 29
  • 30. 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 30
  • 31. Tạm hoãn thực thi foreground process  Dùng tổ hợp phím Ctrl-Z Process tương ứng chuyển sang 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 KH&KTMT - Đại học Bách Khoa Tp. HCM 31
  • 32. Tạm hoãn thực thi foreground process (2)  Nếu muốn cho process tiếp tục thực thi ở chế độ foreground, dùng lệnh fg n (trong đó n là chỉ số của job hiển thị trong ngoặc vuông, ví dụ [1], [4], …), còn muốn process thực thi ở chế độ background thì dùng lệnh bg 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 32
  • 33. Thực thi process ở background  Thêm dấu & (ampersand) vào cuối lệnh  Ví dụ $ find / ‚*.profile‛ -print > kq& [1] 2548  Trình thông dịch lệnh tạo ra một process tương ứng với chương trình đó đồng thời in ra job number và PID của process được tạo ra.  Ngay sau khi thực thi, trình thông dịch sẵn sàng nhận lệnh mới (không bị blocked như đối với foreground process) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 33
  • 34. 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ần tái định hướng standard output để tránh mất dữ liệu xuất.  Người dùng không thể tương tác với chương trình qua standard input là bàn phím => cần phải tái định hướng standard input thông qua file nếu process đó cần nhập dữ liệu. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 34
  • 35. Quản lý background process  Liệt kê các job đang hoạt động – dùng lệnh jobs $ jobs -l [1]+ 3584 Running xterm-g 90x55 [2]- 3587 Running xterm-g 90x55  Đối với các quá trình, có thể:  Chuyển process từ thực thi background sang foreground và ngược lại dùng lệnh fg hoặc bg  Kết thúc một quá trình Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 35
  • 36. Chuyển foreground thành background process 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ần tham số) [1]+ ls –R / > kq& Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 36
  • 37. Chuyển background thành foreground process  Dùng lệnh fg (foreground)  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 37
  • 38. Kết thúc quá trình  Dùng lệnh kill kill [-signal] process_identifier  Cần dùng lệnh ps trước để biết PID của quá trình.  Có thể dùng lệnh đơn giản như sau: kill process_identifier hoặc kill -9 process_identifier Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 38
  • 39. Nội dung  Biên dịch và thực thi chương trình C/C++  Giới thiệu về process  Cơ bản về process  Background và foreground process  Các lệnh thao tác với process  Lập trình với process 39Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM
  • 40. 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ọi thực thi lệnh/chương trình khác bằng system(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 40
  • 41. 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ọi thực thi lệnh/chương trình khác bằng system(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 41
  • 42. Sơ lược về *NIX  Đơn khối (monolithic)  Đa nhiệm (multitasking)  Nhiều người dùng đồng thờ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 42
  • 43. 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 43
  • 44. Kiến trúc tổng quan Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 44
  • 45. Kiến trúc luận lý Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 45
  • 46. *NIX Kernel Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 46
  • 47. Kernel vs. user space Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 47
  • 48. 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ọi thực thi lệnh/chương trình khác bằng system(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 48
  • 49. Quản lý các quá trình  Đa nhiệm  Tác vụ -> process.  Mỗi process có:  Không gian địa chỉ (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 49
  • 50. Danh định của process  Process identifier (PID) duy nhất, tăng dần từ 0  Một số PID đặc biệt:  0: root  1: init  … Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 50
  • 51. Bộ nhớ của process  Text: chứa chương trình – code thực thi - chứa các instruction dành cho CPU thực hiện - read only.  Data: vùng dữ liệu - chứa các biến được khai báo tĩnh hoặc động – xin cấp phát trong lúc thực thi.  Stack: chứa trạng thái và các thông tin liên quan đến việc gọi hàm. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 51
  • 52. Cấu trúc bộ nhớ  Process memory layout:  Text segment (code)  Data segment  Stack  Heap  Command-line arguments  Environment variables Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 52
  • 53. Cấu trúc bộ nhớ Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 53
  • 54. Địa chỉ bộ nhớ  Địa chỉ do process tham khảo chỉ là địa chỉ ảo  Có thể truy xuất thông tin bộ nhớ qua các biến toàn cục:  etext: địa chỉ sau vùng text  edata: địa chỉ kết thúc vùng initialized data  end: địa chỉ bắt đầu vùng heap  Định nghĩa macro để in địa chỉ một biến #define PADDR(x) printf(#x " at %un", &x) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 54
  • 55. #include <stdio.h> #include <stdlib.h> #define PADDR(x) printf(#x " at %un", &x); extern unsigned etext, edata, end; int a = 0, b; int main(int argc, char *argv[]) { printf("End of text seqment at %un", &etext); printf("End of initialized statics and externals at %un", &edata); printf("End of uninitialized statics and externals at %un", &end); PADDR(a); PADDR(b); return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 55
  • 56. 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ọi thực thi lệnh/chương trình khác bằng system(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 56
  • 57. Lấy đối số và biến môi trường  Chương trình C int main(int argc, char *argv[]) { }  Trong đó  int argc: số tham số của chương trình khi chạy  char *argv[]: danh sách các tham số  Ngoài ra, còn có các biến ngoại (external variable)  extern char **environ: danh sách biến môi trường Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 57
  • 58. Lấy đối số và biến môi trường  Gọi thực thi chương trình myapp: $ ./myapp 12 34 56 78 The biggest integer is 78 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 58 5 ./myapp 12 34 56 78 argc argv
  • 59. #include <stdio.h> #include <stdlib.h> extern char **environ; int main(int argc, char *argv[]) { int i; printf(‚Number of arguments is %dn",argc); printf(‚Arguments:n"); for(i=0; i<argc; i++) printf("argv[%d]=%sn",i,argv[i]); getchar(); for (i=0; environ[i]!=(char *)0; i++) printf("%sn",environ[i]); return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 59
  • 60. Lấy PID của process #include <unistd.h> pid_t getpid(void); Lấy PID của process hiện hành pid_t getppid(void); Lấy PID của process cha Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 60
  • 61. Ví dụ #include <stdio.h> #include <unistd.h> int main() { printf("Processid: %dn", getpid()); printf("Parent process id: %dn", getppid()); return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 61
  • 62. 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ọi thực thi lệnh/chương trình khác bằng system(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 62
  • 63. Tạo process Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 63 Parent Child fork()
  • 64. Tạo process Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 64 Parent process Text Data Stack Parent process Text Data Stack fork()
  • 65. Chu kỳ sống của process Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 65 Parent Child Child Zombie Parent fork() wait() exec() exit()
  • 66. Tạo process  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ếu thất bại, trả về -1 và lý do kèm theo:  ENOMEM: không đủ bộ nhớ  EAGAIN: số process vượt quá giới hạn cho phép Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 66
  • 67. Ví dụ  Dạng mẫu chươ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 KH&KTMT - Đại học Bách Khoa Tp. HCM 67
  • 68. #include <stdio.h> #include <unistd.h> int main() { int pid; if ((pid=fork())==0) { printf("Child process output: PID=%dn",getpid()); printf("My parent PID is %dnn",getppid()); }else if(pid>0) { printf("Parent process output: PID=%dn‚,getpid()); printf("Child PID=%dn‚,pid); }else { printf("Fork error!n"); exit(1); } return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 68
  • 69. Kết thúc process  Dùng system call exit()  Orphaned process: process cha kết thúctrước -> process con sau đó sẽ có cha là init (PID=1)  Zombied process  Process kết thúc nhưng chưa báo trạng thái cho process cha biết.  Dùng hàm wait() hay waitpid() ở process cha để lấy trạng thái trả về từ process con. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 69
  • 70. Đợi process con #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *stat_loc, int options); Trả về PID của process con thay đổi trạng thái, hoặc -1 nếu thất bại Đối số pid: < -1: Đợi bất kỳ process con nào có process group ID bằng với |pid| = -1: Đợi bất kỳ process con nào = 0: Đợi bất kỳ process con nào có process group ID bằng với process group ID của process gọi. > 0: Đợi pocess có PID bằng với giá trị này Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 70
  • 71. Đợi process con #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc); Tham khảo manpage của system call waitpid(), wait() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 71
  • 72. Ví dụ #include <stdio.h> #include <unistd.h> #define PROCESSNUM 3 /* Number of processes */ int main(int argc, char *argv[]) { int count, retval, child_no; /* Creating processes */ retval=1; for (count=0; count<PROCESSNUM; count++) { if (retval!=0) retval=fork(); else break; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 72
  • 73. /* Execution of child processes */ if (retval==0) { child_no=count; printf("Child #%d has PID: #%dn‛, child_no,getpid()); sleep(rand()%5); } else { /* Waiting for children termination */ for (count=0; count<PROCESSNUM; count++) wait(NULL); printf(‚Parent has PID (process-id): #%dn‛, getpid()); } return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 73
  • 74. 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ọi thực thi lệnh/chương trình khác bằng system(), exec…() Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 74
  • 75. Các hàm gọi thực thi chương trình  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 KH&KTMT - Đại học Bách Khoa Tp. HCM 75
  • 76. Hàm system()  Xử lý một lệnh được chỉ ra trong thông số string và trả về sau khi lệnh được thực thi xong  Thực chất thì lời gọi hàm system(string) sẽ thực hiện lệnh sh -c string  Giá trị trả về:  0: thành công  -127: mã lỗi không khởi động shell để thực hiện lệnh  -1: mã lỗi khác  <> -1: mã trả về khi thực hiện lệnh string Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 76
  • 77. Hàm system()  Ví dụ #include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { if(!system("ls -l /")) printf("Call system() OK!n"); return 0; } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 77
  • 78. Các hàm exec…()  Các hàm exec…() thực hiện như sau: Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 78 $ command fork produces a child process execve, overlay child process image with command image Command has finished, exit, return, etc. $ prompt returns Shell waits for the command to finish command executes
  • 79. Các hàm exec…()  Chú ý  Các hàm exec sẽ thay thế process gọi hàm bằng chương trình tương ứng trong tham số nhập của hàm. Vùng text, data, stack bị thay thế, vùng user (user area) không bị thay thế.  Chương trình được gọi bắt đầu thực thi ở hàm main() (entry point), có thể nhận tham số nhập thông qua các tham số truyền vào các hàm exec.  Ví dụ  Gọi thực thi lệnh ở dấu nhắc $ ls -l /  Chương trình dùng exec…() execl(‚/bin/ls‛,‚/bin/ls‛,‚-l‛, ‚/‛, (char*)0); Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 79
  • 80. Phân tích tên gọi các hàm exec…()  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 KH&KTMT - Đại học Bách Khoa Tp. HCM 80
  • 81. Phân tích tên gọi các hàm exec…()  Hàm có chứa kí tự l (execl, execlp, execle) dùng danh sách tham số là các pointer đến string, kết thúc danh sách này là một NULL pointer.  Hàm có chứa kí tự v (execv, execvp, execve) dùng danh sách tham số là một array các pointer đến string, kết thúc là một NULL pointer. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 81
  • 82. Phân tích tên gọi các hàm exec…()  Hàm có chứa kí tự p (execlp, execvp) chấp nhận tên của chương trình cần chạy, khi chạy chương trình đó, nó sẽ tìm trong execution path hiện tại; các hàm không có kí tự p phải cung cấp đầy đủ đường dẫn đến chương trình cần chạy.  Hàm có chứa kí tự e (execle, execve) có thêm một thông số khác là biến môi trường. Thông số này phải là một pointer trỏ đến các string, và string cuối cùng của pointer này là NULL pointer. Mỗi string mà pointer này trỏ đến có dạng “VARIABLE=value”. Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 82
  • 83. Tóm tắt tên các hàm exec…() Tên hàm Tham số Tự động tìm biến môi trường Tự động tìm đường dẫn 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 KH&KTMT - Đại học Bách Khoa Tp. HCM 83
  • 84. Ví dụ 1 #include <stdio.h> #include <unistd.h> void main() { execlp("/sbin/ifconfig","/sbin/ifconfig","-a",0); }  Dịch và chạy $ gcc –o ex1 ex1.c $ ./ex1 eth0 Link encap:Ethernet Hwaddr 00:60:8C:84:E6:0E ...... Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 84
  • 85. Ví dụ 2 #include <stdio.h> #include <unistd.h> void main(int argc, char *argv[]){ execv("/sbin/ifconfig",argv); }  Dịch và chạy $gcc –o ex2 ex2.c $./ex2 -a eth0 Link encap:Ethernet Hwaddr 00:60:8C:84:E6:0E … Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 85
  • 86. Ví dụ 3 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 86 #include <stdio.h> #include <stdlib.h> #include <errno.h> extern char **environ; int main(int argc, char **argv) { int pid, status; char *child_argv[4]; if (argc==1) return 1; pid=fork();
  • 87. Ví dụ 3 (tt) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 87 if (pid==-1) return -1; if (pid==0) { child_argv[0]=‚sh‛; child_argv[1]=‚-c‛; child_argv[2]=argv[1]; child_argv[3]=0; execve(‚/bin/sh‛, child_argv, environ); exit(127); }
  • 88. Ví dụ 3 (tt) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 88 do { if (waitpid(pid, &status, 0)==-1) { if (errno!=EINTR) return -1; } else return status; } while(1); return 0; }
  • 89. Questions??? Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 89