Linux下C語言編程——關於進程

摘抄網上的pdf文件,有增改。

 

 

一:五種狀態:

1.新建:表示進程正在被創建。

2.運行:表示進程正在運行。

3.阻塞:進程正在等待某一個事件發生。

4.就緒:表示系統正在等待CPU來執行命令。

5.完成:表示進程已經結束,系統正在回收資源。

二:getpid()可以得到進程 的ID,getppid()可以得到父進程 的ID.

#include<unistd.h>

pid_t getpid(void);

pid_t getppid(void);


getuid可以得到進程的所有者的ID。由於進程要用到一些資源,而Linux對系統資源是進行保護的,爲了獲取一定的資源,進程還有一個有效用戶ID。geteuid()可以得到進程的有效用戶ID和用戶ID,相對應進程還有一個組ID和有效組ID,系統調用getgid和getegid可以分別得到組ID和有效組ID

getuid——————進程的所有者ID

geteuid————— 有效用戶ID和用戶ID

getgid——————組ID

getegid—————-有效組ID

getpwuid————--用戶其他信息

#include<unistd.h>

#include<sys/types.h>

 

uid_t getuid(void);

uid_t geteuid(void);

gid_t getgid(void);

gid_t getegid(vodi);

對用戶的其他信息感興趣,可以調用getpwuid來得到。

 

三:創建一個進程的系統調用——fork()

#include<unistd.h>

pid_t fork();

一個進程調用fork以後,系統會創建一個子進程。子進程和父進程不同的地方只有ID ,其他都一樣,就像克隆自己。爲了區分子進程和父進程,必須跟蹤fork的返回值 ,對於父進程fork返回子進程的ID,對於fork子進程返回0。

 

爲什麼父進程要創建子進程?

Linux 是一個多用戶操作系統,在同一時間會有許多的用戶在爭奪系統的資源.有時進程爲了早一點完成任務就創建子進程來爭奪資源. 一旦子進程被創建,父子進程一起從fork 處繼續執行,相互競爭系統的資源。

有時候我們希望子進程繼續執行,而父進程阻塞知道子進程完成任務。這時候調用wait()或者waitpid()

#include<sys/types.h>

#include<sys/wait.h>

 

pid_t wait(int *stat_loc)

pid_t waitpid(pid_t pid,int *stat_loc,int options);

 

wait系統調用會使父進程阻塞 直到一個子進程結束 或者是父進程接受到一個信號 ,如果沒有父進程沒有子進程或他的子進程已經結束了wait會立即返回。成功時(因一個子進程結束)wait將返回子進程的ID ,否則返回-1,並設置全局變量errno.stat_loc是子進程的退出狀態 。子進程調用exit,_exit或者是return來設置這個值。爲得到這個值,linux定義了幾個宏來測試這個返回值。

    WIFEXITED:判斷子進程退出值是非0

    WEXITSTATUS:判斷子進程的退出值(當子進程退出時非0)

    WIFSIGNALED:子進程由於有 沒有獲得的信號而退出。

    WTERMSIG:子進程沒有獲得的信號號(在WIFSIGNALED爲真時纔有意義)

waitpid等待指定的子進程直到子進程返回 。如果pid爲正值則等待指定的進程(pid).如果爲0則等待任何一個組ID和調用者的組ID相同的進程。 爲-1時等同於wait調用 。小於-1時等待任何一個組ID等於pid絕對值的進程。

 

options可以決定父進程的狀態,可以取兩個值

WNOHANG:父進程立即返回沒有子進程存在時。

WUNTACHED:當子進程結束時waitpid返回,但是子進程的退出狀態不可得到。

 

子進程一般要執行不同的程序,爲了調用系統程序,可以使用exec族調用。

#include <unistd.h>;

int execl(const char *path,const char *arg,...);

int execlp(const char *file,const char *arg,...);

int execle(const char *path,const char *arg,...);

int execv(const char *path,char *const argv[]);

int execvp(const char *file,char *const argv[]):

 

後臺進程的創建思想:首先父進程創建一個子進程人然後子進程殺死父進程。信號處理的所有工作由子進程來處理。 (mail例子)

 

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