Chương 4
Kỹ thuật lập trình nâng cao
124
Lập trình nhúng ARM-Linux
Mục tiêu chương 4
Sau khi kết thúc chương n{y, sinh viên có thể
• Nắm được kh|i niệm tiến trình (process), quan hệ
giữa c|c tiến trình
• Trình b{y được cơ chế sử dụng signal để giao tiếp
giữa c|c tiến trình
• Lập trình sử dụng kỹ thuật đa tiến trình • Trình b{y kh|i niệm luồng • Lập trình ứng dụng đa luồng
125
Lập trình nhúng ARM-Linux
Nội dung
4.1. Tiến trình (process) 4.2. Cơ chế sử dụng signal 4.3. Lập trình giao tiếp đa tiến trình 4.4. Luồng (thread) 4.5. Lập trình ứng dụng đa luồng
126
Lập trình nhúng ARM-Linux
4.1. Tiến trình (Process)
Kh|i niệm tiến trình Lập trình đa tiến trình
127
Lập trình nhúng ARM-Linux
Khái niệm tiến trình
Tiến trình được tạo ra khi ta thực thi một chương
trình
Đa tiến trình cho phép nhiều chương trình cùng
thực thi v{ chia sẻ dữ liệu với nhau
C|c tham số của một tiến trình
• PID (Process ID): số hiệu tiến trình • PPID (Parent Process ID): số hiệu tiến trình cha • Command: c}u lệnh được gọi để thực thi tiến trình ls –e –o pid,ppid,command
128
Lập trình nhúng ARM-Linux
PID, PPID
Lấy về PID: sử dụng hàm getpid() Lấy về PPID: sử dụng hàm getppid() Hàm getpid() và getppid() trả giá trị kiểu pid_t (bản chất là kiểu int)
129
Lập trình nhúng ARM-Linux
Dừng tiến trình
C|ch 1: Sử dụng tổ hợp phím Ctrl + C C|ch 2: Sử dụng shell command
kill PID
130
Lập trình nhúng ARM-Linux
Tạo tiến trình mới
Cách 1: sử dụng h{m system
131
Lập trình nhúng ARM-Linux
Tạo tiến trình mới
Cách 2: sử dụng h{m fork v{ exec
132
Lập trình nhúng ARM-Linux
4.2. Cơ chế sử dụng signal
Signal l{ cơ chế cho phép giao tiếp giữa c|c tiến
trình
Signal l{ cơ chế không đồng bộ Khi tiến trình nhận được signal, tiến trình phải xử
lý signal ngay lập tức Linux hỗ trợ 32 SIGNAL
133
Lập trình nhúng ARM-Linux
Danh sách signal thường dùng
Kiểu SIGNAL
Lý do gửi SIGNAL
SIGHUP
Báo cho chương trình khi thoát khỏi terminal
SIGINT
Khi người dùng nhấn Ctrl + C để tắt chương trình
SIGILL
Khi chương trình chạy lệnh không hợp lệ
SIGABRT
Khi chương trình nhận được lệnh abort
SIGKILL
Khi chương trình nhận được lệnh kill (đóng chương trình)
SIGUSR2
Tùy biến theo chương trình
134
SIGUSR1 Tùy biến theo ứng dụng
Lập trình nhúng ARM-Linux
Gửi SIGNAL tới process
kill [-SIGNAL_TYPE] PID
Cách 1: sử dụng shell command Cách 2: sử dụng h{m kill trong chương trình, cho
phép process n{y gửi signal tới process kh|c kill(PID, SIGNAL_TYPE)
135
Lập trình nhúng ARM-Linux
4.3. Lập trình giao tiếp đa tiến trình
Cơ chế:
• Tiến trình chính tạo ra c|c tiến trình con sử dụng
lệnh fork v{ exec
• Sử dụng cơ chế signal để trao đổi tín hiệu giữa c|c
tiến trình
136
Lập trình nhúng ARM-Linux
Ví dụ
Bắt v{ xử lý signal được gửi tới một tiến trình
(SIGTERM và SIGINT)
137
Lập trình nhúng ARM-Linux
killsignal.c
138
Lập trình nhúng ARM-Linux
Ví dụ: killsignal.c (tiếp)
139
Lập trình nhúng ARM-Linux
Demo
140
Lập trình nhúng ARM-Linux
4.4. Luồng (thread)
Một chương trình mặc định chạy một luồng ->
luồng chính
Luồng chính có thể tạo ra c|c luồng kh|c, c|c luồng
sẽ chạy đồng thời -> tăng tốc chương trình
C|c luồng chia sẻ không gian nhớ, truy xuất file v{
các tài nguyên khác
Tham số của một luồng:
• thread ID: số hiệu luồng (kiểu dữ liệu pthread_t)
141
Lập trình nhúng ARM-Linux
4.5. Lập trình xử lý đa luồng
Tạo luồng Truyền tham số cho luồng Nhận gi| trị trả về từ luồng Tắt luồng
142
Lập trình nhúng ARM-Linux
Tạo luồng
Khai b|o thư viện: pthread.h H{m tạo luồng: pthread_create
thread: thread id attr: các thuộc tính của luồng, mặc định để NULL start_routine: hàm thực thi trong luồng arg: các tham số truyền cho luồng
Biên dịch chương trình:
gcc –o multithread multithread.c -pthread
143
Lập trình nhúng ARM-Linux
Mã nguồn tạo luồng
144
Lập trình nhúng ARM-Linux
Truyền tham số cho luồng
Khai báo cấu trúc dữ liệu chứa dữ liệu cần truyền cho
luồng. Ví dụ:
struct arg { //Ky tu can in char character; //So lan can in int count; };
Truyền dữ liệu cho luồng khi tạo luồng qua tham số
arg
Chương trình con thực thi luồng nhận tham số về và
xử lý
145
Lập trình nhúng ARM-Linux
Mã nguồn truyền tham số cho luồng
146
Lập trình nhúng ARM-Linux
Tắt luồng
Sử dụng h{m pthread_cancel:
thread: nhận tham số thread id của luồng
muốn tắt
147
Lập trình nhúng ARM-Linux
Mã nguồn tắt luồng
148
Lập trình nhúng ARM-Linux
Thảo luận
149
Lập trình nhúng ARM-Linux