Linux進程編程(一)

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章