Tải bản đầy đủ (.pdf) (24 trang)

chap01 c linux p2 vanlangembeddedsystems

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (334.34 KB, 24 trang )

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




×