linux下進程相關操做

1、定義和理解
狹義定義:進程是正在運行的程序的實例。
廣義定義:進程是一個具備必定獨立功能的程序關於某個數據集合的一次運行活動。
進程的概念主要有兩點:
第一,進程是一個實體。 每個進程都有它本身的地址空間,通常狀況下,包括文本區域、數據區域和堆棧區域。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。
第二,進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成爲一個活動的實體,咱們稱其爲進程。
 
進程的屬性
進程標誌符:進程ID,內核分配,該標誌符非負,範圍0~32767
父進程和父進程ID(PPID) 
啓動進程的用戶ID(UID)和所歸屬的組(GID);
進程的有效用戶ID和有效組ID   
進程的進程組ID:一個進程能夠屬於某一個進程組。
進程的會話ID:每個進程都屬於唯一的會話。 
進程狀態:狀態分爲運行R、休眠S、阻塞Z;
進程執行的優先級;
進程所鏈接的終端名;
進程資源佔用:好比佔用資源大小(內存、CPU佔用量);
2、進程的相關操做
(1)獲取進程屬性和更改屬性
獲取:
getpid(void) 獲取當前進程ID
getppid(void) 獲取當前進程的父進程ID
getpgrp(void) 獲取當前進程的進程組ID
getpgid(pid_t pid) 獲取進程組ID
getuid(void) 獲取當前進程的用戶ID
geteuid(void) 獲取當前進程的有效用戶ID
getgid(void) 獲取當前進程的用戶組ID
getegid(void) 獲取當前進程的有效用戶組ID
getsid(pid_t pid) 獲取當前進程的會話ID
設置:
int setpgid(pid_t pid,pid_t pgid)
setpgid()將參數pid 指定進程所屬的組ID設爲參數pgid 指定的組識別碼。若是參數pid 爲0,則會用來設置目前進程的組ID,若是參數pgid爲0,則會以 
目前進程的進程ID來取代。
int setpgrp(void)  
setpgrp()將目前進程所屬的組ID設爲目前進程的進程ID。此函數至關於調用setpgid(0,0)。  
pid_t setsid(void)  
setsid函數,調用該函數的進程將做爲新會話的領導者建立一個新的會話,會話和調用進程的進程組ID,將被設置爲調用進程的進程ID,並返回該進程ID 
int setuid(uid_t uid) 設置進程的用戶ID
int setreuid(uid_t ruid, uid_t euid) 將進程的實際用戶ID設置爲ruid,有效用戶ID設置爲euid
int seteuid(uid_t uid) 設置進程的有效用戶ID爲uid
int setgid(gid_t gid) 設置進程的組ID
int setregid(gid_t rgid, gid_t egid) 將進程的實際組ID設置爲rgid,有效組ID設置爲egid
int setegid(gid_t gid) 設置進程的有效組ID
進程優先級: linux系統爲多進程同時運行,Linux採用了時間片輪轉的進程調度方式。進程的優先級定義了進程被調度的優先順序,優先級的數值越低,其優先級就越高。  
Linux用nice系統調用來修改進程的優先級,默認狀況下,進程的優先級爲0,系統容許的優先級的 範圍爲:-20~2
int nice(int inc)  
nice()用來改變進程的進程執行優先順序。參數inc數值越大則優先順序排在越後面,即表示進程執行會越慢。  只有超級用戶才能使用負的inc值,表明優先順序排在前面,進程執行會較快。返回值  若是執行成功則返回0,不然返回-1,失敗緣由存於errno中。錯誤代碼  EPERM 通常用戶企圖轉用負的參數inc值改變進程優先順序。 nice系統調用只能用於修改進程自身的優先級。
setpriority(設置程序進程執行優先權)
定義函數  int setpriority(int which,int who, int prio);
函數說明  setpriority()可用來設置進程、進程組和用戶的進程執行優先權。參數which有三種數值,
參數 who則依which值有不一樣定義
which     who 表明的意義
PRIO_PROCESS     who爲進程ID
PRIO_PGRP           who爲進程的組ID
PRIO_USER          who爲用戶ID
參數prio介於-20 至20 之間。表明進程執行優先權,數值越低表明有較高的優先次序,執行會較頻繁。 
此優先權默認是0,而只有超級用戶(root)容許下降此值。返回值  執行成功則返回0,若是有錯誤發生返回值則爲-1,錯誤緣由存於errno。 ESRCH 參數which或who 可能有錯,而找不到符合的進程EINVAL 參數which值錯誤。EPERM 權限不夠,沒法完成設置 EACCES
通常用戶沒法下降優先權
int getpriority(int which,int who);
函數說明  getpriority()可用來取得進程、進程組和用戶的進程執行優先權。 參數  which有三種數值,參數who 則依which值有不一樣定義
which             who 表明的意義
PRIO_PROCESS    who 爲進程ID
PRIO_PGRP         who 爲進程的組ID
PRIO_USER         who 爲用戶ID
此函數返回的數值介於-20 至20之間,表明進程執行優先權,數值越低表明有較高的優先次序,執行會較頻繁。 返回值  返回進程執行優先權,若有錯誤發生返回值則爲-1 且錯誤緣由存於errno。附加說明  因爲返回值有多是-1,所以要同時檢查errno是否存有錯誤緣由。最好在調用次函數前先清除errno變量。錯誤代碼  ESRCH 參數which或who 可能有錯,而找不到符合的進程。EINVAL 參數which 值錯誤。
 
(2)建立進程
一、int fork( void );
返回值:子進程中返回0,父進程中返回子進程ID,出錯返回-1  
函數說明:一個現有進程能夠調用fork函數建立一個新進程。由fork建立的新進程被稱爲子進程(child process)。  
fork函數被調用一次但返回兩次。兩次返回的惟一區別是子進程中返回0值而父進程中返回子進程ID。  
子進程是父進程的副本,它將得到父進程數據空間、堆、棧等資源的副本。
注意,子進程持有的是上述存儲空間的「副本」,這意味着父子進程間不共享這些存儲空間,它們之間共享的存儲空間只有代碼段。
深刻理解能夠參見:linux中fork()函數詳解 http://os.chinaunix.net/a2012/0203/1306/000001306508.shtml
二、int vfork( void );
返回值:子進程中返回0,父進程中返回子進程ID,出錯返回-1  
vfork與fork大體相同,區別以下:
1) fork要拷貝父進程的數據段;而vfork則不須要徹底拷貝父進程的數據段,在子進程沒有調用exec和exit以前,子進程與父進程共享數據段
2) fork不對父子進程的執行次序進行任何限制;而在vfork調用中,子進程先運行,父進程掛起,直到子進程調用了exec或exit以後,父子進程的執行次序纔再也不有限制
 
(3)exec函數族
在fork後的子進程中使用exec函數族,能夠裝入和運行其它程序(子進程替換原有進程,和父進程作不一樣的事)。 fork建立一個新的進程就產生了一個新的PID,exec啓動一個新程序,替換原有的進程,所以這個新的被 exec 執行的進程的PID不會改變(和調用exec的進程的PID同樣)。
 
(4)進程等待
一、pid_t wait (int * status);
函數說明: wait()函數的工做過程是:先判斷子進程是否存在,便是否成功建立了一個子進程。若是建立失敗,則會直接退出並提示相關錯誤信息,並返回-1;若是建立成功,wait()將父進程掛起,直到子進程結束,並返回子進程結束時的狀態和PID。
若是有子進程,退出時的結束狀態(status)有如下兩種:
1)子進程正常結束:如調用exit(0)。
2)信號引發子進程結束:如調用kill(pid_t pid, int sig);
若是不在乎結束狀態值,則參數status 能夠設成NULL。
 
二、 pid_t waitpid(pid_t pid,int * status,int options);
 返回值:若是執行成功則返回子進程識別碼(PID),若是有錯誤發生則返回-1。失敗緣由存於errno 中。
 函數說明: waitpid()會暫時中止目前進程的執行,直到有信號來到或子進程結束。若是在調用 wait()時子進程已經結束,則wait()會當即返回子進程結束狀態值。
   子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一快返回。若是不在乎結束狀態值,則參數status 能夠設成NULL。參數pid 爲欲等待的子進程識別碼,其餘數值意義以下:
   pid<-1 等待進程組識別碼爲pid 絕對值的任何子進程。
   pid=-1 等待任何子進程,至關於wait()。
   pid=0 等待進程組識別碼與目前進程相同的任何子進程。
   pid>0 等待任何子進程識別碼爲pid 的子進程。
   參數option 能夠爲0 或下面的OR 組合:
   WNOHANG 若是沒有任何已經結束的子進程則立刻返回,不予以等待。
   WUNTRACED 若是子進程進入暫停執行狀況則立刻返回,但結束狀態不予以理會。
   子進程的結束狀態返回後存於status,底下有幾個宏可判別結束狀況:
   WIFEXITED(status)若是子進程正常結束則爲非0值。
   WEXITSTATUS(status)取得子進程exit()返回的結束代碼,通常會先用WIFEXITED 來判斷是否正常結束才能使用此宏。
   WIFSIGNALED(status)若是子進程是由於信號而結束則此宏值爲真。
   WTERMSIG(status) 取得子進程因信號而停止的信號代碼,通常會先用WIFSIGNALED 來判斷後才使用此宏。
   WIFSTOPPED(status) 若是子進程處於暫停執行狀況則此宏值爲真。通常只有使用WUNTRACED 時纔會有此狀況。
   WSTOPSIG(status) 取得引起子進程暫停的信號代碼,通常會先用WIFSTOPPED 來判斷後才使用此宏。
 
(5)進程通訊
如今linux使用的進程間通訊方式:
一、管道(pipe)和有名管道(FIFO)
1)管道(pipe)的介紹
A.管道是半雙工的,數據只能向一個方向流動;須要雙方通訊時,須要創建起兩個管道
B.只能用於父子進程或者兄弟進程之間(具備親緣關係的進程);
C.單獨構成一種獨立的文件系統:管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,而且只存在與內存中。
D.數據的讀出和寫入:一個進程向管道中寫的內容被管道另外一端的進程讀出。寫入的內容每次都添加在管道緩衝區的末尾,而且每次都是從緩衝區的頭部讀出數據。 
2)管道的建立
建立一個無名管道可使用系統調用 pipe()。它接受一個參數,也就是一個包括兩個整數的數組。若是系統調用成功,此數組將包括管道使用的兩個文件描述符。建立一個管道以後,通常狀況下進程將產生一個新的進程。
系統調用: pipe();
原型:int pipe(int fd[2]);
返回值:若是系統調用成功,返回0。若是系統調用失敗返回-1:
errno=EMFILE(沒有空親的文件描述符)        
 EMFILE(系統文件表已滿)         
 EFAULT(fd數組無效)
注意:fd[0]用於讀取管道,fd[1]用於寫入管道。
3)有名管道的介紹
無名管道,因爲沒有名字,只能用於親緣關係的進程間通訊.。爲了克服這個缺點,提出了有名管道(FIFO)。
FIFO不一樣於無名管道 之處在於它提供了一個路徑名與之關聯,以FIFO的文件形式存在於文件系統中,這樣,即便與FIFO的建立進程不存在親緣關係的進程,只要能夠訪問該路徑,就可以彼此經過FIFO相互通訊,所以,經過FIFO不相關的進程也能交換數據。值的注意的是,FIFO嚴格遵循先進先出(first in first out),對管道及FIFO的讀老是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如lseek()等文件定位操做。
注意:有名管道的名字存在於文件系統中,內容存放在內存中

4)有名管道建立html

#include<sys/types.h>linux

#include<sys/stat.h>數組

int mkfifo(const char *pathname,mode_t mode);socket

返回:若成功則爲0,若出錯返回-1函數

一旦已經用mkfifo建立了一個FIFO,就可用open打開它。確實,通常的文件I/O函數(close,read,write,unlink等)均可用於FIFO。當打開一個FIFO時,非阻塞標(O_NONBLOCK)產生下列影響:post

A、在通常狀況中(沒有說明O_NONBLOCK),只讀打開要阻塞到某個其餘進程爲寫打開此FIFO。相似,爲寫而打開一個FIFO要阻塞到某個其餘進程爲讀而打開它。ui

B、若是指一了O_NONBLOCK,則只讀打開當即返回。可是,若是沒有進程已經爲讀而打開一個FIFO,那麼只寫打開將出錯返回,其errno是ENXIO。相似於管道,若寫一個尚無進程爲讀而打開的FIFO,則產生信號SIGPIPE。若某個FIFO的最後一個寫進程關閉了該FIFO,則將爲該FIFO的讀進程產生一個文件結束標誌。url

FIFO相關出錯信息:EACCES(無存取權限)EEXIST(指定文件不存在)
ENAMETOOLONG(路徑名太長)
ENOENT(包含的目錄不存在)
ENOSPC(文件系統餘空間不足)
ENOTDIR(文件路徑無效)
EROFS(指定的文件存在於只讀文件系統中)
spa

管道是基於文件描述符的通訊方式。(因此會用到關於文件操做的一些函數)
使用方法能夠參見 coding之路http://blog.sina.com.cn/s/blog_8713d5b20100tmod.html
二、信號(signal)
可詳細參見下面大牛的博客:
 
(5)進程退出
http://blog.csdn.net/muge0913/article/details/7317580
 
本文參考內容:
六、http://blog.csdn.net/muge0913/article/details/7317580
相關文章
相關標籤/搜索