一、描述進程-PCB
● 進程信息被放在一個叫做進程控制塊的數據結構中,表示的是進程的集合體。
● 在Linux操作系統下的PCB是task_struct
● task_struct 是Linux下內核的數據結構,它會被裝載到內存裏幷包含着進程的信息
二、進程
● 標識符:描述本進程的唯一標識符,用來區別其他進程
● 狀態:任務狀態,退出代碼,退出信號等。
● 優先級:相對於其他進程的優先級。
● 程序計數器:程序中即將被執行的下一條指令的地址
● 內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針。
● 上下文數據:進程執行時處理器的寄存器中的數據。
● I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表
三、如何查看進程的信息
1)、通過ps和top等指令可查看進程信息
看一段代碼Linux操作系統下實現
#include<stdio.h>
int main()
{
while(1)
{
sleep(1);
}
return 0;
}
2)、通過系統調用獲取進程標識符
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
printf("pid:%d\n",getpid());
printf("ppid:%d\n",getppid());
return 0;
}
這裏的pid和ppid分別是進程的id和父進程的id
3)、系統調用創建進程-fork()
● fork()有兩個返回值
● 父子進程代碼共享,但是數據各自獨有(頁表映射)。
● fork()創建進程,子進程和父進程擁有相同的代碼、虛擬地址空間(虛擬的可以相同)、頁表,但是頁表映射的物理地址空間不同。
● fork返回值起到分流作用,用戶通過fork的返回值判斷分別父子進程
對於父進程來說子進程創建成功便返回的是子進程的ID;
對於子進程來說返回的是0;
創建失敗便返回小於0的數。
● 通過man 2 fork查看fork()接口。
看一段代碼演示
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<errno.h>
4 #include<string.h>
5 #include<stdlib.h>
6 int main()
7 {
8 pid_t pid;
9 pid=fork();
10 if(pid<0)
11 {
12 perror("fork error");
13 return -1;
14 }
15 else if(pid==0)
16 {
17 printf("child process pid is %d \n",pid);
18 }
19 else
20 {
21 printf("this is parent process:%d\n",pid);
22 }
23 sleep(1);
24 return 0;
25 }
來看看結果
當程序中沒有sleep(1)的時候程序運行結果會是如何
這裏輸出的格式完全不一致。
不瞭解前臺、後臺進程=>(https://zhidao.baidu.com/question/6036645.html)
個人理解:當創建了test1.c文件開始進行寫代碼開始運行時可看做是一個新的進程,Linux系統會把當前進程當做前臺進程,把-bash進程當做後臺進程,所以當沒有sleep時父進程的輸出是在當前進程輸出,子進程當然是在當前進程退出後,後臺bash成爲前臺進程便輸出子進程的輸出。
四、進程的狀態
Linux進程狀態:R (TASK_RUNNING),可執行狀態。
Linux進程狀態:S (TASK_INTERRUPTIBLE),可中斷的睡眠狀態.
Linux進程狀態:D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態。
Linux進程狀態:T (TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態。
Linux進程狀態:Z (TASK_DEAD - EXIT_ZOMBIE),退出狀態,進程成爲殭屍進程。
Linux進程狀態:X (TASK_DEAD -EXIT_DEAD),退出狀態,進程即將被銷燬。