Linux系統編程總結(1)

一 進程概念

1.進程產生
  操作運行了一個程序,至少會產生一個進程

2.Linux 創建進程

struct task_struct
{
    進程號    (PID)
    父進程號  (PPID)
    運行地址空間
    一組寄存器值
    進程狀態
    ....
};

問題:進程與程序的區別?
回答:程序就是一個編譯好的可執行文件,而進程是操作系統爲了執行一個程序而創建的,進程是程序的一次執行過程

二 進程相關的命令

1.ps -ef
查看進程的PID和PPID

2.ps aux
查看進程狀態 R:運行態  S:可中斷的等待態  D:不能中斷的等待態   T:停止態 Z:殭屍態(PID資源未釋放)

3.kill
<1>kill -l 查看系統中信號
<2>發送信號到指定的進程
   kill  -信號  PID
   例如:
   kill  -SIGSTOP   5207

4.killall
給同名的進程發信號

killall -信號  進程名

5.查看系統允許的最大進程個數
 cat /proc/sys/kernel/pid_max   -> 32768

三 創建子進程

pid_t fork(void);
功能:創建子進程
返回值:
成功給父進程返回子進程的PID,給子進程返回0,失敗返回-1

思考:如何創建子進程?
回答:複製父進程

殭屍進程:進程結束,但是父進程沒有對它進行收屍處理
孤兒進程:父親進程結束,子進程就會變成孤兒進程,孤兒進程會自動被init進程收養

問題:爲什麼創建子進程?
回答:創建子進程的目的是讓子進程執行獨立任務

問題:子進程和父進程會不會相互影響
回答:不會,父子進程的地址空間是獨立

練習:
創建兩個子進程,子進程1輸出"hello word"然後結束,
子進程2 進行while(1) , 父進程進行while(1)


四 父進程回收殭屍態子進程

pid_t wait(int *status);
功能:等待殭屍態子進程
參數:
@status  獲取殭屍態子進程狀態
返回值:
成功返回殭屍態子進程PID,失敗返回-1(沒有子進程)

常用用法: wait(NULL);

pid_t waitpid(pid_t pid, int *status, int options);
參數:
@pid     -1:等待任意一個子進程退出    子進程的PID:等待指定PID子進程
@status  獲取子進程退出的狀態 
@options 0:阻塞的方式調用    WNOHANG:非阻塞方式調用
返回值:
成功返回殭屍態子進程PID,失敗返回-1, 如果沒有子進程處於殭屍態,且非阻塞方式調用,此時立即返回,返回值爲0

waitpid(-1,NULL,0);   => wait(NULL);
waitpid(pid,NULL,0);

waitpid(-1,NULL,WNOHANG);//常用的用法

waitpid(pid,NULL,WNOHANG);

五 結束一個進程

return  : 在main函數使用return,用來結束進程
_exit() : 用來結束一個進程
exit()  : 用來結束一個進程,刷新緩存

exit(EXIT_SUCCESS)  成功 
exit(EXIT_FAILURE)  失敗

例如:
fd = open(...);
if(fd < 0){
    fprintf(stderr,"...");
    exit(EXIT_FAILURE);
}

六 在一個進程中運行另外一個程序(啓動另外一個進程)

exec 函數族:
在一個進程中執行一個程序,替換原進程所有資源(代碼段,數據段, ...),只保留原進程的PID


bash執行程序的流程:
bash ---> < fork --->子進程 >---->調用exec函數族---->執行我們的可執行程序

int execl(const char *path, const char *arg, ...);
l : list
int execl(可執行文件路徑,可執行文件名,傳遞參數1,傳遞參數2,...,NULL);

例如:
執行/bin/ls ,傳遞的參數是-l
execl("/bin/ls","ls","-l",NULL);


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

例如:
執行/bin/ls ,傳遞的參數是-l
execlp("ls","ls","-l",NULL);


v:vetcor (參數存放在指針數組中)
int execv(const char *path, char *const argv[]);


例如:
執行/bin/ls ,傳遞的參數是-l

char *arg[] = {"ls","-l",NULL};
execv("/bin/ls",arg);

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

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


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