LẬP TRÌNH
HỆ THỐNG NHÚNG
CƠ BẢN
Chương 01:Lập trình C/C++ trên Linux
(P2: Tiến trình)
GV:
Email:
Nguyễn Ngọc Tú
Nội dung
Giới thiệu lập trình nhúng và môi trường Linux
(T1)
NNTu
Tiến trình
(T2)
Xuất nhập và truyền nhận sử dụng IPC
(T3-4)
Xuất nhập trực tiếp thiết bị qua Port
(T5)
Hệ Thống Nhúng - Embedded Systems (W 2008)
2
Cơ bản về tiến trình - 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 chủ yếu 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
Lệnh: ps, jobs, fg n, bg n, &.
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
3
Cơ bản về tiến trình - Process
& Æ “background”
[root@penguinvm
[1] 6718
[root@penguinvm
UID
PID
root
6718
Job Number
NNTu
log]# sleep 10h &
log]# ps -ef
PPID C STIME TTY
6692 0 14:49 ttyp0
Process ID (ID)
TIME CMD
00:00:00 sleep 10h
Parent Process ID
Hệ Thống Nhúng - Embedded Systems (W 2008)
4
Cơ bản về tiến trình - 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 với
background proces
NNTu
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.
Hệ Thống Nhúng - Embedded Systems (W 2008)
5
Cơ bản về tiến trình - Process
Đ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:
NNTu
registers, program counter, stack pointer,….
Hệ Thống Nhúng - Embedded Systems (W 2008)
6
Cơ bản về tiến trình - Process
Process identifier (PID): duy nhất, tăng dần từ 0
Một số PID đặc biệt:
NNTu
0: root
1: init
…
Hệ Thống Nhúng - Embedded Systems (W 2008)
7
Bộ nhớ của Tiến trình
Text: chứa chương trình–code thực thi-chứa
các các instruction dành cho CPU thực hiệnread 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.
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
8
Bộ nhớ của Tiến trì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
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
9
PID
#including <unistd.h>
pid_t
Lấy PID của process hiện hành
pid_t
NNTu
getpid(void);
getppid(void);
Lấy PID của process cha
Hệ Thống Nhúng - Embedded Systems (W 2008)
10
VD1:
#include <stdio.h>
#include <unistd.h>
int
main() {
printf("Processid: %d\n",
printf("Parentprocess id: %d\n",
return 0;
}
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
getpid());
getppid());
11
Tạo tiến trình
Nhân bản Process hiện hành
Process con (child): process mới được tạo ra
Process cha (parent): process hiện hành
Parent
fork()
Child
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
12
Chu kỳ sống của Process
wait()
Parent
Parent
fork()
Child
NNTu
exec
Child
exit
Hệ Thống Nhúng - Embedded Systems (W 2008)
Zombie
13
Tạo process
Dùng hàm:
Nếu thành công:
pid_t fork(void);
0:
trong process con
PID củacon (>0):
trong process cha.
Nếu thất bại, trả về -1 và lý do kèm theo:
NNTu
ENOMEM: không đủ bộ nhớ
EAGAIN: số process vượt quá giới hạn cho phép
Hệ Thống Nhúng - Embedded Systems (W 2008)
14
VD2:
pid_t pid;
pid = fork();
if (pid == 0) {
// mã chương trình con
} else if (pid > 0) {
// mã chương trình cha
} else {
// báo lỗi
}
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
15
Mô hình
Process CHA
Process
Text
fork()
Data
Process CON
Stack
Process
Text
Data
Stack
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
16
VD3:
#include <stdio.h>
#include <unistd.h>
int main() {
int childid;
if ((childid = fork()) == 0) {
printf("Childprocess output: PID = %d\n",getpid());
printf("Myparent PID is %d\n",
getppid());
}else if (childid > 0) {
printf("Parentprocess output: PID= %d\t", getpid());
printf("ChildPID=%d\n", childid);
}else {
printf("Forkerror !\n");
exit(1);
}
return 0;
}
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
17
Kết thúc tiến trình
Dùng system call
Orphaned process
exit()
process cha kết thúc trước
process con sau đó sẽ có cha là init (PID=1)
Zombied process
NNTu
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.
Hệ Thống Nhúng - Embedded Systems (W 2008)
18
Kết thúc tiến trình
waitpid()
#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 kết thúc,
-1 nếu thất bại
Đối số pid:
< -1: Đợi các tiến trình con có “group ID” bằng với PID của nó
= -1: Đợi bất kỳ các process con nào
= 0: Đợi bất kỳ các process con nào có process group ID bằng
với PID của nó.
> 0: Đợi pocess có PID bằng với giá trị này
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
19
Kết thúc tiến trình
wait()
#include <sys/types.h>
#include <sys/wait.h>
pid_t
NNTu
wait ( int *stat_loc );
Hệ Thống Nhúng - Embedded Systems (W 2008)
20
VD4:
#include <stdio.h>
#include <unistd.h>
#define PROCESSES
3
int main( int argc, char *argv[ ]) {
int count, retval, child_no;
retval= 1;
for( count = 0; count < PROCESSES; count++ ) {
if( retval != 0 ) retval= fork();
else break;
}
if ( retval == 0 ) {
child_no = count;
printf("Child #%d has PID (process-id): #%d\n", getpid());
sleep( rand()%5 );
} else {
for( count = 0; count < PROCESSES; count++ )
wait(NULL);
}
return 0;
}
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
21
Bài Tập !
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
22
Q/A
NNTu
Hệ Thống Nhúng - Embedded Systems (W 2008)
23
K=5
i=3
K=3
i=3
NNTu
K=4
i=3
Hệ Thống Nhúng - Embedded Systems (W 2008)
24