1.進程資源:
進程:系統下用戶管理事物的基本單元,每個進程有自己獨立的運行空間。
管理每個進程的資源的結構體:struct task_struct(定義在內核頭文件include/linux/sched.h)
結構體task_struct 包含的信息:線程基本信息,內存信息,tty終端信息,當前目錄信息,打開文件描述符信息,信號信息以及進程屬性
2.用戶級進程狀態:
就緒/運行狀態(TASK_RUNNING):正在運行或處於就緒狀態。
可被中斷等待(TASK_INTERRUPTIBLE):處於等待隊伍中,等待資源有效時喚醒,可被中斷。
不可被中斷等待(TASK_UNINTERRUPTIBLE):處於等待隊伍中,等待資源有效時喚醒,但不可被中斷。
僵死狀態(TASK_ZOMBIE):即將從任務鏈表中刪除,但在task中仍然有一個task_struct數據結構,等待父進程釋放。
停止狀態(TASK_STOPPED):進程已經結束,已經釋放了相應的資源,但未釋放進程控制塊,可以被喚醒。
3.進程基本屬性:
3.1.進程號(PID)不能修改:系統維護的唯一表示一個進程的正整數,無法在用戶層修改。
調用getpid()獲取當前進程的pid(getpid()在/usr/include/unistd.h中聲明),若失敗返回-1
實例:
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
printf("the current program's pid is %d\n",getpid());
return 0;
}
3.2父進程號(ppid),不能修改:定義如下
#include<unistd.h>
extern __pid_t getppid(void);
成功返回當前進程的父進程PID 錯誤返回 -1,錯誤原因存儲在errno 中
應用實例:
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
printf("the current program's ppid is %d\n",getppid());
return 0;
}
運行結果:
root@ubuntu:/home/administrator/Desktop# gcc -o test test.c
[1]+ Done ./test 1
root@ubuntu:/home/administrator/Desktop# ./test
the current program's ppid is 3570
3.3 進程組號(PGID),一個或多個進程的集合,定義如下:
#include<unistd.h>
extern __pid_t getpgid(__pid_t pid);
應用實例:
#include<stdio.h>#include<unistd.h>
int main(int argc, char *argv[])
{
int i;
printf("\t pid\t ppid \t pgid\n");
printf("parent\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
for(i=0;i<2;i++)
if (fork()==0) printf("child\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
return 0;
}
程序運行結果: