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