Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
334,34 KB
Nội dung
LẬP TRÌNH HỆ THỐNG NHÚNG CƠ BẢN Chương 01:Lập trình C/C++ Linux (P2: Tiến trình) GV: Email: Nguyễn Ngọc Tú Tu.NN79@gmail.com Nội dung Giới thiệu lập trình nhúng mơi trường Linux (T1) NNTu Tiến trình (T2) Xuất nhập 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) Cơ tiến trình - Process Process: chương trình thực thi User theo dõi trạng thái process, tương tác với process Có hai loại user process chủ yếu hệ thống Foreground process Background process Các “process” thực cơng việc hệ điều hành gọi kernel_thread, daemon Lệnh: ps, jobs, fg n, bg n, & NNTu Hệ Thống Nhúng - Embedded Systems (W 2008) Cơ 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 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) Cơ tiến trình - Process Background process xuất kết standard output hình lúc thực thi Cần tái định hướng standard output để tránh liệu xuất Người dùng tương tác với chương trình qua standard input bàn phím với background proces NNTu Cần phải tái định hướng standard input thơng qua file process cần nhập liệu Hệ Thống Nhúng - Embedded Systems (W 2008) Cơ 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 liệu Stack Trạng thái process: NNTu registers, program counter, stack pointer,… Hệ Thống Nhúng - Embedded Systems (W 2008) Cơ tiến trình - Process Process identifier (PID): nhất, tăng dần từ Một số PID đặc biệt: NNTu 0: root 1: init … Hệ Thống Nhúng - Embedded Systems (W 2008) Bộ nhớ Tiến trình Text: chứa chương trình–code thực thi-chứa các instruction dành cho CPU thực hiệnread only Data: vùng liệu-chứa biến khai báo tĩnh động-xin cấp phát lúc thực thi Stack: chứa trạng thái thông tin liên quan đến việc gọi hàm NNTu Hệ Thống Nhúng - Embedded Systems (W 2008) Bộ nhớ Tiến trình Địa process tham khảo địa ảo Có thể truy xuất thơng tin nhớ qua biến toàn cục: etext: địa sau vùng text edata: địa kết thúc vùng initialized data end: Địa bắt đầu vùng heap NNTu Hệ Thống Nhúng - Embedded Systems (W 2008) PID #including pid_t Lấy PID process hành pid_t NNTu getpid(void); getppid(void); Lấy PID process cha Hệ Thống Nhúng - Embedded Systems (W 2008) 10 VD1: #include #include 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 Process hành Process (child): process tạo Process cha (parent): process hành Parent fork() Child NNTu Hệ Thống Nhúng - Embedded Systems (W 2008) 12 Chu kỳ sống 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: process PID củacon (>0): process cha Nếu thất bại, trả -1 lý kèm theo: NNTu ENOMEM: không đủ nhớ EAGAIN: số process vượt 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 } 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 #include 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 sau có cha init (PID=1) Zombied process NNTu Process kết thúc 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ả từ process Hệ Thống Nhúng - Embedded Systems (W 2008) 18 Kết thúc tiến trình waitpid() #include #include pid_t waitpid(pid_t pid, int *stat_loc, int options); Trả PID process kết thúc, -1 thất bại Đối số pid: < -1: Đợi tiến trình có “group ID” với PID = -1: Đợi process = 0: Đợi process có process group ID với PID > 0: Đợi pocess có PID với giá trị NNTu Hệ Thống Nhúng - Embedded Systems (W 2008) 19 Kết thúc tiến trình wait() #include #include pid_t NNTu wait ( int *stat_loc ); Hệ Thống Nhúng - Embedded Systems (W 2008) 20 VD4: #include #include #define PROCESSES int main( int argc, char *argv[ ]) { int count, retval, child_no; retval= 1; for( count = 0; count < PROCESSES; count++ ) { if( retval != ) retval= fork(); else break; } if ( retval == ) { 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 ... Process: chương trình th c thi User theo dõi trạng thái process, tương t c với process C hai loại user process chủ yếu hệ thống Foreground process Background process C c “process” th c. .. call Orphaned process exit() process cha kết th c trư c process sau c cha init (PID=1) Zombied process NNTu Process kết th c chưa báo trạng thái cho process cha biết Dùng hàm wait()... PID đ c biệt: NNTu 0: root 1: init … Hệ Thống Nhúng - Embedded Systems (W 2008) Bộ nhớ Tiến trình Text: chứa chương trình–code th c thi-chứa c c instruction dành cho CPU th c hiệnread