Cơ bản về tiến trình - Processtác với process Foreground process Background process hành còn gọi là các kernel_thread, daemon... Cơ bản về tiến trình - Process Background process vẫ
Trang 1LẬP TRÌNH
GV: Nguyễn Ngọc Tú Email: Tu.NN79@gmail.com
Chương 01:Lập trình C/C++ trên Linux
(P2: Tiến trình)
Trang 3Cơ bản về tiến trình - Process
tác với process
Foreground process
Background process
hành còn gọi là các kernel_thread, daemon
Trang 4Cơ bản về tiến trình - Process
[root@penguinvm log]# sleep 10h &
[1] 6718
[root@penguinvm log]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 6718 6692 0 14:49 ttyp0 00:00:00 sleep 10h
& Æ “background”
Job Number Process ID (ID) Parent Process ID
Trang 5Cơ 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
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
Trang 6Cơ bản về tiến trình - Process
Trang 7Cơ 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:
1: init
…
Trang 8Bộ 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ệ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.
Trang 9 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
Trang 12Tạo tiến trình
Nhân bản Process hiện hành
Parent
Child
fork()
Trang 13Chu kỳ sống của Process
Trang 14Tạo process
Dùng hàm:
pid_t fork(void);
Nếu thành công:
Nếu thất bại, trả về -1 và lý do kèm theo:
ENOMEM: không đủ bộ nhớ
: số process vượt quá giới hạn cho phép
Trang 16Mô hình
Process Text Data
Text Data
Process CHA
Process CON
fork()
Trang 17printf("Childprocess output: PID = %d\n",getpid());
printf("Myparent PID is %d\n", getppid());
Trang 18Kết thúc tiến trình
Dùng system call
exit()
Orphaned process
Zombied process
process cha biết
Trang 19Kế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
Trang 21#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();
Trang 22Bài Tập !
Trang 23Q/A