十四、Linux进程编程
一、進程概念
????????進程和線程的對比網上很多資料有介紹,這邊有一篇文章,大家可以參考一下:https://www.cnblogs.com/qianqiannian/p/7010909.html
linux上查看進程的命令:top,就可以像window下查看任務管理器一下。按q退出。
二、進程ID
1、每一個進程都有一個唯一的標識符,進程ID 簡稱pid
- 進程id 一般默認的最大值為32768,不過也是可以修改的,當然一般情況下不需要這么做。如果當前進程是1000,那么下一個分配的進程就是1001,它是嚴格線性分配的。
- 除了init 進程,其它進程都是由其它進程創立的。創立新進程的進程叫父進程,新進程叫子進程。
2、獲取子進程的函數
?????????pid_t getpid(void)
????????– 參數:無
????????– 返回值:成功返回進程號
3、獲取父進程的函數
????????pid_t getppid(void)
????????– 參數:無
????????– 返回值:成功返回父進程?
三、exec函數族
1、2linux中,可以使用exec函數族將程序載入內存,實現多個程序的運行。
2、exec函數族參數?
int execl(const char *path, const char *arg, ...)
函數說明:
execl()其中后綴"l"代表list也就是參數列表的意思,第一參數path字符指針所指向要執行的文件路徑, 接下來的參數代表執行該文件時傳遞的參數列表:argv[0],argv[1]... 最后一個參數須用空指針NULL作結束。
函數返回值:
成功則不返回值, 失敗返回-1。
3、execl函數特點:
當進程調用一種exec函數時,該進程完全由新程序代換,而新程序則從其main函數開始執行。因為調用exec并不創建新進程,所以前后的進程ID并未改變。exec只是用另一個新程序替換了當前進程的正文、數據、堆和棧段。
用另一個新程序替換了當前進程的正文、數據、堆和棧段。
當前進程的正文都被替換了,那么execl后的語句,即便execl退出了,都不會被執行。
?
4、應用例程:代碼1將調用代碼2,代碼2將替換代碼1,
代碼1:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include <unistd.h>//exec函數族 int main(void) {if(execl("/mnt/udisk/helloexec","helloexec","execl",NULL) == -1){perror("execl error");exit(1);}//程序已經跳轉走,如果正常execl不反回錯誤,下面的代碼不會執行!printf("execl error!\n");return 0; }代碼2:
#include <stdio.h>int main(int arc,char *argv[]) {printf("Hello %s!\n",argv[1]); }5、exec函數簇還有很多其他的函數。
exec函數族參數
????????– “l”和“v”表示參數是以列表還是以數組的方式提供的
????????– “p”表示這個函數的第一個參數是*path,就是以絕對路徑來提供程序的路徑,也可以以當前目錄作為目標
????????– “e”表示為程序提供新的環境變量
如下圖,這邊就不一一介紹了,大家可以在終端里輸入man 3 exec?打開幫助文檔,自己查看具體用法。
四、fork創建新進程
1、linux中,可以使用fork函數創建和當前進程一模一樣的進程,叫子進程,原來的進程叫父進程。
2、創建進程函數
????????pid_t fork(void)
????????– 參數:無
????????– 返回值:執行成功,子進程pid 返回給父進程,0 返回給子進程;出現錯誤-1,返回給父進程。執行失敗的唯一情況是內存不夠或者id 號用盡,不過這種情況幾乎很少發生。
運行結果如下:?
總結
以上是生活随笔為你收集整理的十四、Linux进程编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迅为i-TOP4412出厂首次烧写
- 下一篇: 一、linux驱动理论