Linux進程(一)
進程概念
進程是程序的一次運行活動
也就是每當有一個程序跑起來後,系統內就會多出一個進程。
1.我們可以通過ps指令來查看系統中存在的進程:
實際使用中,一般配合grep來查找程序中的進程
ps -aux|grep init
注:aux的意義是全部進程;grep的意義是過濾關鍵字
2.使用top指令可以查看進程的佔用情況,類似windows裏的任務管理器
進程標誌符
每個進程都有一個非負整數表示唯一的ID,叫做pid,這個id可以複用,但上一個結束的進程和新建的進程id不會相同
pid = 0; 稱爲交換進程(swapper)
作用——進程調度
pid = 1; init進程
作用——系統初始化
#include <unistd.h>
pid_t getpid(void); //返回值:調用進程的進程id
pid_t getppid(void); //返回值:調用進程的父進程id
使用:
pid_t pid;
pid_t getpid(void);
printf("my pid is %d\n",pid);
while(1);
return 0;
父進程與子進程
進程A創建了進程B,A就爲父進程,B爲子進程
C程序存儲空間分配
1.
2.參考UNIX環境高級編程
函數fork
一個現有的進程可以調用fork函數創建一個新進程
#include <unistd.h>
pid_t fork(void); //返回值:子進程返回0,父進程返回子進程ID;若出錯,返回-1
例
pid_t pid;
pid_t pid2;
pid_t retpid;
pid=getpid();
printf("before fork :pid=%d\n",pid);
retpid=fork():
pid2=getpid();
printf("after fork : pid = %d\n",pid2);
if(pid==pid2)
{
printf("this is father print : iretpid = %d\n",retpid);
}
else
{
printf("this child print ,retpid = %d,child pid = %d\n",retpid,getpid());
}
return 0;
輸出結果:
before fork :pid=5794
after fork : pid = 5794
this is father print : iretpid = 5795
after fork : pid = 5795
this child print ,retpid = 0,child pid = 5795
fork創建一個子進程的一般目的
(1)一個父進程希望複製自己,使父、子進程同時執行不同的代碼段。這在網絡服務進程中是常見的——父進程等待客戶端的服務請求。當這種請求到達時,父進程調用fork,使子進程區處理這個請求。父進程則繼續等待下一個服務請求到達。
(2)一個進程要執行一個不同的程序。這對shell是常見的情況。在這種情況下,子進程從fork返回後立即調用exec