国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換)

這篇具有很好參考價值的文章主要介紹了[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????????hello,大家好,這里是bang___bang_,在上兩篇中我們講解了進程的概念、狀態(tài)和進程地址空間,本篇講解進程的控制!!包含內容有進程創(chuàng)建、進程等待、進程替換、進程終止??!

附上前2篇文章鏈接:

Linux——操作系統(tǒng)進程詳解!?。ńㄗh收藏細品!?。bang___bang_的博客-CSDN博客

[Linux]環(huán)境變量 進程地址空間(虛擬內存與物理內存的關系)_bang___bang_的博客-CSDN博客

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

?

目錄

?1??計算機四個重要概念

2??進程創(chuàng)建

??fork函數初識

??fork返回值

??fork調用失敗原因

3??進程終止

??進程終止的場景

??退出碼

??查看退出碼echo

??字符串格式查看錯誤信息strerror

??退出碼講解

??進程常見退出方法

??_exit函數——系統(tǒng)調用接口

??exit函數——C庫函數

??return退出

4??進程等待

??進程等待必要性

??進程等待的方法

??wait方法

??waitpid方法

5??進程程序替換

??替換原理

??替換函數

??execl函數

??execv函數

??execlp函數

??execle函數

??execvp函數

??execvpe函數

??execve函數(系統(tǒng)調用)


1??計算機四個重要概念

?競爭性:系統(tǒng)進程數目眾多,而CPU資源只有少量,甚至1個,所以進程之間是具有競爭屬性的。為了高效完成任務,更合理競爭相關資源,便具有了優(yōu)先級

?獨立性:多進程運行,需要獨享各種資源,多進程運行期間互不干擾

?并行:多個進程在多個CPU下分別,同時進行運行,這稱之為并行

?并發(fā):多個進程在一個CPU下采用進程切換的方式,在一段時間之內,讓多個進程都得以推進,稱之為并發(fā)

2??進程創(chuàng)建

fork創(chuàng)建子進程,操作系統(tǒng)都做了什么?

????????fork創(chuàng)建子進程,系統(tǒng)多了一個進程。

????????進程=內核數據結構+進程代碼和數據!

??fork函數初識

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

  • 創(chuàng)建子進程:失敗返回-1,成功返回子進程PID給父進程,0返回給子進程

進程調用fork,當控制轉移到內核中的fork代碼后,內核做:

????????分配新的內存塊和內核數據結構給子進程

????????★將父進程部分數據結構內容拷貝至子進程

????????★添加子進程到系統(tǒng)進程列表當中

????????★fork返回,開始調度器調度

在進程詳解篇,我提到過父子進程代碼共享。

那么有個問題:是父進程所有的代碼子進程都共享呢?還是在fork函數之后的代碼才共享?

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
代碼共享猜想圖

??寫一段fork代碼看看結果(提示:眼見不一定為實

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
int main()
{
    int num=0;
    int*p=&num;
    printf("Begin:pid:%d,&num:%p\n",getpid(),p);
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
    }
    printf("After:pid:%d,fork return %d,&num:%p\n",getpid(),id,p);
    return 0;
}
[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
fork驗證結果圖

根據結果我們發(fā)現Begin在子進程并沒有執(zhí)行,但這能表示子進程沒有共享父進程的Begin代碼嗎?

答案是不是的!??!實際上子進程也共享到了父進程的Begin語句,只不過CPU中有個EPI寄存器,他保存了進程的上下文信息,使得子進程以為fork是他的開始,從fork語句后開始執(zhí)行!!

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
實際代碼共享圖

創(chuàng)建子進程,給子進程分配對應的內核空間結構,必須子進程自己獨有,因為進程具有獨立性!理論上,子進程也要有自己的代碼和數據!可是一般而言,我們創(chuàng)建的子進程沒有加載的過程(代碼和數據一般是從磁盤上加載到的程序),也就是說,子進程沒有自己的代碼和數據!所以,子進程只能“使用”父進程的代碼和數據!

?? ?代碼:都是不可被寫的,只能讀取,所以父子共享!

????數據:可能被修改的,所以,必須分離!

??fork返回值

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

????????★子進程返回0

????????★父進程返回子進程的pid

????????★出錯返回-1

為什么fork會有2個返回值?是因為寫時拷貝!!

在進程地址空間中我有講解,這里再簡單講解一下!

基于進程的獨立性,父子進程的數據必須分離,但是對于只讀的數據我們也進行拷貝的話,對內存太過于浪費,所以出現了一種新的技術:寫時拷貝技術!

寫時拷貝,是一種延時申請技術,可以提高整機內存的使用率。

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
寫時拷貝

子進程執(zhí)行讀權限的時候,父子進程頁表映射到同一物理內存,當執(zhí)行寫權限時,OS重新拷貝一份數據到物理內存上,同時子進程的頁表斷開原來的映射關系,映射到拷貝數據的物理地址。

??fork調用失敗原因

????????系統(tǒng)中有太多的進程

????????★實際用戶的進程數超過了限制

3??進程終止

進程終止時,操作系統(tǒng)做了什么?

答:釋放進程申請的相關內核數據結構和對應的數據和代碼。本質:釋放系統(tǒng)資源。

??進程終止的場景

?????????代碼運行完畢,結果正確

?????????代碼運行完畢,結果不正確

?????????代碼異常退出

??退出碼

??查看退出碼echo

//獲取最近一個進程,執(zhí)行完畢的退出碼!
echo $?
[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
echo示例圖

問題:main函數返回值的意義是什么?為什么總是0?

并不是總是0,返回值是進程的退出碼!0表示進程運行結果正確,非0表示進程運行結果錯誤。

返回值的意義:返回給上一級進程,用來評判該進程執(zhí)行結果用的,可以忽略。讓上層能根據程序的退出碼定位代碼出錯的原因。非0值有無數個,不同的非0值就可以標識不同的錯誤原因??!從而給我們的程序在運行結束之后,結果不正確時,方便定位錯誤的原因細節(jié)!

??字符串格式查看錯誤信息strerror

為了方便我們查看對應的錯誤是什么,C庫提供了一個函數strerror,將錯誤以字符串的形式打印

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
strerror結果

??退出碼講解

退出碼在status參數中!

status并不是按照整數來整體使用的!而是按照bit位的方式,將32個bit位進行劃分(位圖)

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
status低16位

上圖是status的低16位示意圖。

次低8位,表示子進程退出的退出碼。獲取:(status&0xFF00)>>8
低7位,表示進程收到(操作系統(tǒng))的信號(表示退出信號)。獲?。?status & 0x7F

系統(tǒng)提供了2個宏來獲取退出碼和退出信號:

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

WIFEXITED(status): 若為正常終止子進程返回的狀態(tài),則為真。(查看進程是否是正常退出)
?
WEXITSTATUS(status): 若WIFEXITED非零,提取子進程退出碼。(查看進程的退出碼)
WIFEXITED(status)      //是否正常退出
WEXITSTATUS(status)    //若正常退出,獲取退出碼

使用:grep -ER 'xxxx' /usr/include 進行查找?

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

進程異常退出,或者崩潰,本質是操作系統(tǒng)通過發(fā)送信號殺掉了你的進程??!

??進程常見退出方法

?

??_exit函數——系統(tǒng)調用接口

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

參數:status 定義了進程的終止狀態(tài),父進程通過wait來獲取該值。

??測試status次低8位作退出碼:
#include<stdio.h>    
#include<unistd.h>    
                                            
int main()                                                                
{                                                                                                                                                               
   _exit(-1);                       
}    
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
status次低8位測試結果圖

將status設為-1,補碼為全1,但是只有8位,所以退出碼顯示為255(1111 1111)

??exit函數——C庫函數

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

exit最后也會調用_exit,但在調用前還刷新了緩沖區(qū)。

??觀察_exit和exit的區(qū)別:

/*_exit測試*/
#include<stdio.h>    
#include<unistd.h>    
                                            
int main()                                                                
{                                                                           
    printf("hello");                                                                                     
   _exit(0);                       
}
   
/*exit測試*/ 
#include<stdio.h>    
#include<stdlib.h>    
                                            
int main()                                                                
{                                                                           
    printf("hello");                                                                                     
    exit(0);                       
}
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
_exit和exit對比結果圖

printf輸出是對stdout標準輸出文件寫入,stdout文件的緩沖區(qū)刷新策略是行刷新,即遇到\n刷新!

測試中沒有\(zhòng)n,也就不會刷新緩沖區(qū),也就不會顯示hello。

????????但是通過結果圖我們可以看到系統(tǒng)調用_exit沒有打印,C庫函數exit有打印,也就是說exit還刷新了緩沖區(qū)。

??return退出

????????return是一種更常見的退出進程方法。 執(zhí)行return n等同于執(zhí)行exit(n) , 因為調用 main 的運行時函數會將 main 的返回值當做exit 的參數。

??return等同于執(zhí)行exit

#include<stdio.h>    
   
int main()    
{    
    printf("hello");    
    return 0;                                                                                            
}    
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
return測試圖

現象和exit一樣,main返回值當做exit的參數。

4??進程等待

??進程等待必要性

? 子進程退出,父進程如果不管不顧,就可能造成‘僵尸進程’的問題,進而造成內存泄漏。
? 進程一旦變成僵尸狀態(tài),kill -9 也無能為力,因為誰也沒有辦法殺死一個已經死去的進程。
? 父進程派給子進程的任務完成的如何,我們需要知道。
? 父進程通過進程等待的方式,回收子進程資源,獲取子進程退出信息。

??進程等待的方法

??wait方法

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

參數:輸出型參數,獲取子進程退出狀態(tài),不關心則可以設置為NULL

返回值:成功,返回被等待進程的pid;失敗,則返回-1。

??wait系統(tǒng)接口的阻塞式測試:

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
不關心子進程退出狀態(tài)

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
獲取子進程退出狀態(tài)

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

??waitpid方法

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
    當正常返回的時候waitpid返回收集到的子進程的進程ID;
    如果設置了選項WNOHANG,而調用中waitpid發(fā)現沒有已退出的子進程可收集,則返回0;
    如果調用中出錯,則返回-1,這時errno會被設置成相應的值以指示錯誤所在;
pid:
    pid=-1,等待任一個子進程。與wait等效。
    pid>0.等待其進程ID與pid相等的子進程。
status:輸出型參數!
    WIFEXITED(status): 若為正常終止子進程返回的狀態(tài),則為真。(查看進程是否是正常退出)
    WEXITSTATUS(status): 若WIFEXITED非零,提取子進程退出碼。(查看進程的退出碼)
options:默認為0,表示阻塞等待
    WNOHANG(非阻塞等待): 若pid指定的子進程沒有結束,則waitpid()函數返回0,不予以等待。若正常結束,則返回該子進程的ID。

waitpid(pid,NULL,0)==wait(NULL)

??waitpid系統(tǒng)接口的阻塞式測試:

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
waitpid阻塞式測試

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止?結果與wait一致。

???等待回收僵尸進程:

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
未等待

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
等待

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

??waitpid非阻塞式輪詢檢測測試:

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>

//非阻塞等待測試代碼

int main()
{
    pid_t id=fork();
    if(id==0)
    {
        //子進程
        int cnt=5;
        while(cnt)
        {
            printf("我是子進程:%d\n",cnt--);
            sleep(1);
        }
        exit(11); //退出碼11,僅用來測試
    }
    else{
        int quit=0;
        while(!quit)
        {
            int status=0;
            pid_t res=waitpid(-1,&status,WNOHANG);//以非阻塞方式等待
            if(res>0)
            {
                //等待成功&&子進程退出
                printf("等待子進程退出成功,退出碼:%d\n",WEXITSTATUS(status));
                quit=1;
            }
            else if(res==0)
            {
                //等待成功&&但子進程并未退出
                printf("子進程還在運行中,暫時還沒有退出,父進程可以再等一等,處理其他事情\n");
            }
            else 
            {
                //等待失敗
                printf("wait失敗!\n");
                quit=1;
            }
            sleep(1);
        }
    }
}

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

問題:父進程通過wait/waitpid可以拿到子進程的退出結果,為什么要用wait/waitpid函數呢?直接全局變量不行嗎?

答:不行,因為進程具有獨立性,數據就要發(fā)生寫實拷貝,父進程無法拿到正確的退出結果。

問題:既然進程是具有獨立性的,進程退出碼,不也是子進程的數據嗎?父進程又憑什么拿到呢?

答:僵尸進程:至少要保留該進程的PCB信息!task_struct里面保留了任何進程退出時的退出結果信息!!

wait/waitpid本質是讀取子進程的task_struct結構中的(退出碼:exit_code,退出信號exit_signal)

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

5??進程程序替換

之前:fork()之后,父子各自執(zhí)行父進程代碼的一部分;父子代碼共享,數據寫時拷貝各自一份!

現在:如果子進程就想執(zhí)行一個全新的程序呢?

想有自己的代碼!就需要進程的程序替換,來完成這個功能。

??替換原理

????????用fork 創(chuàng)建子進程后執(zhí)行的是和父進程相同的程序 ( 但有可能執(zhí)行不同的代碼分支 ), 子進程往往要調用一種 exec 函數以執(zhí)行另一個程序。當進程調用一種exec 函數時 , 該進程的用戶空間代碼和數據完全被新程序替換 , 從新程序的啟動例程開始執(zhí)行。調用exec 并不創(chuàng)建新進程 所以調用 exec 前后該進程的 id 并未改變。

?

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
程序替換原理圖

??替換函數

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

函數名 參數格式 是否帶路徑 是否使用當前環(huán)境變量
execl 列表 不是
execlp 列表
execle 列表 不是 不是,需自己組裝環(huán)境變量
execv 數組 不是
execvp 數組
execvpe 數組 不是,需自己組織環(huán)境變量

下面我們對各函數進行測試,測試使用ls命令替換程序。模板如下:

[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
測試函數模板

??execl函數

??execl的使用測試:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

int main(int argc,char* argv[],char* env[])
{
    pid_t id=fork();
    if(id==0)
    {
        //子進程
        printf("子進程開始運行,pid:%d\n",getpid());
        sleep(3);

        char* const _argv[]={
           (char*) "ls",
           (char*) "-a",
           (char*) "-l",
            NULL
        };
        //execl函數,傳遞參數列表
        execl("/usr/bin/ls","ls","-a","-l",NULL);
        exit(1);
    }
    else
    {
        //父進程
        printf("父進程開始運行,pid:%d\n",getpid());
        int status=0;
        pid_t id=waitpid(-1,&status,0);//阻塞等待
        if(id>0)
        {
            printf("wait seccess,exit code:%d\n",WEXITSTATUS(status));
        }
    }
    return 0;
}
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
execl結果圖

execl是程序替換,調用該函數成功后,會將當前進程的所有的代碼和數據都進行替換,包括以及執(zhí)行的和沒有執(zhí)行的!(一旦調用成功,后面的所有代碼都不會被執(zhí)行?。?

??execv函數

??execv的使用測試:

//execv函數,傳遞數組
execv("/usr/bin/ls",_argv);
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
execv結果圖

??execlp函數

??execlp的使用測試:

//execlp函數,傳遞文件名(無需路徑)和參數列表
execlp("ls","ls","-a","-l",NULL);
[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
execlp結果圖

??execle函數

??execle的使用測試:

//execle函數,傳遞參數列表和組裝的環(huán)境變量
execle("/usr/bin/ls","ls","-a","-l",NULL,env);
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
execle結果圖

??execvp函數

??execvp的使用測試:

//使用execvp函數,傳遞文件名和數組
execvp("ls",_argv);
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
execvp結果圖

??execvpe函數

??execvpe的使用測試:

//execvpe函數,傳遞文件名,數組,需組織環(huán)境變量
execvpe("ls",_argv,env);
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
execvpe結構圖

?

??execve函數(系統(tǒng)調用)

上面是exec系列的函數,事實上他們都調用execve,只有execve是真正的系統(tǒng)調用

[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止

函數名 參數格式 是否帶路徑 是否使用當前環(huán)境變量
execve 數組 不是 不是,需自己組織環(huán)境變量
[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
關系圖

??execve的使用測試:

exec.c:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

int main(int argc,char* argv[],char* env[])
{
    pid_t id=fork();
    if(id==0)
    {
        //子進程
        printf("子進程開始運行,pid:%d\n",getpid());
        sleep(3);

        char* const _argv[]={
           (char*) "ls",
           (char*) "-a",
           (char*) "-l",
            NULL
        };
        
        char* const _argv_mycmd[]={(char*)"mycmd",(char*)"-a",NULL};
        char* const _env_mycmd[]={(char*)"My_Path=11111",NULL};
        //系統(tǒng)調用execve
        execve("./mycmd",_argv_mycmd,_env_mycmd);
        exit(1);
    }
    else
    {
        //父進程
        printf("父進程開始運行,pid:%d\n",getpid());
        int status=0;
        pid_t id=waitpid(-1,&status,0);//阻塞等待
        if(id>0)
        {
            printf("wait seccess,exit code:%d\n",WEXITSTATUS(status));
        }
    }
    return 0;
}

?mycmd.c:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(int argc,char* argv[])
{
    if(argc!=2)
    {
        printf("can not execute!\n");
        exit(1);
    }

    printf("獲取環(huán)境變量:My_Path:%s\n",getenv("My_Path"));

    if(strcmp(argv[1],"-a")==0)
    {
        printf("hello a!\n");
    }
    else if(strcmp(argv[1],"-b")==0)
    {
        printf("hello b!\n");
    }
    else{
        printf("default!\n");
    }
    return 0;
}
[Linux]進程控制詳解!?。▌?chuàng)建、終止、等待、替換),我在地球學Linux,linux,運維,進程控制,進程創(chuàng)建,進程替換,進程等待,進程終止
execve結構圖

成功將子進程程序替換為mycmd。

問題:為什么要創(chuàng)建子進程,在子進程中進行進程替換?

——如果不創(chuàng)建,那么我們替換的進程只能是父進程,如果創(chuàng)建了,替換的進程就是子進程,而不影響父進程。為了不想影響父進程,我們想讓父進程聚焦在讀取數據,解析數據,指派進程執(zhí)行代碼的功能!


文末結語,本篇結合前2篇內容詳細講解了進程控制,包含:進程創(chuàng)建,進程終止,終止碼,_exit,進程等待的必要性以及方法(wait,waitpid)阻塞式等待和非阻塞式等待,進程程序替換的替換原理以及6大替換函數和系統(tǒng)調用execve替換子進程程序,圖文并茂,使用例子測試代碼。文章來源地址http://www.zghlxwxcb.cn/news/detail-614684.html

到了這里,關于[Linux]進程控制詳解?。。▌?chuàng)建、終止、等待、替換)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Linux進程控制【創(chuàng)建、終止、等待】

    Linux進程控制【創(chuàng)建、終止、等待】

    ?個人主頁: Yohifo ??所屬專欄: Linux學習之旅 ??每篇一句: 圖片來源 ??操作環(huán)境: CentOS 7.6 阿里云遠程服務器 Good judgment comes from experience, and a lot of that comes from bad judgment. 好的判斷力來自經驗,其中很多來自糟糕的判斷力。 進程 創(chuàng)建后,需要對其進行合理管理,光靠

    2024年02月02日
    瀏覽(38)
  • 【Linux】進程控制(創(chuàng)建、終止、等待)

    【Linux】進程控制(創(chuàng)建、終止、等待)

    環(huán)境:centos7.6,騰訊云服務器 Linux文章都放在了專欄:【 Linux 】歡迎支持訂閱 相關文章推薦: 【Linux】馮.諾依曼體系結構與操作系統(tǒng) 【Linux】進程理解與學習Ⅰ-進程概念 【Linux】進程理解與學習Ⅱ-進程狀態(tài) 【Linux】進程理解與學習Ⅲ-環(huán)境變量 【Linux】進程理解與學習Ⅳ

    2023年04月16日
    瀏覽(19)
  • 【Linux初階】fork進程創(chuàng)建 & 進程終止 & 進程等待

    【Linux初階】fork進程創(chuàng)建 & 進程終止 & 進程等待

    ???hello,各位讀者大大們你們好呀?? ????系列專欄:【Linux初階】 ????本篇內容:fork進程創(chuàng)建,理解fork返回值和常規(guī)用法,進程終止(退出碼、退出場景、退出方法、exit),進程等待(wait、waitpid),阻塞等待和非阻塞等待 ????作者簡介:本科在讀,計算機海洋

    2024年02月06日
    瀏覽(24)
  • 【Linux】詳解進程終止&&進程等待

    【Linux】詳解進程終止&&進程等待

    ???????? 頁表中不僅僅只有虛擬地址到物理地址的映射,還包括了很多選項,其中就包括了映射條目的權限。當我們進程的代碼和數據加載到內存并和進程地址空間建立映射關系時,如果數據的內容不允許被修改(比如說常量字符串),對應數據在頁表中的映射條目的權

    2024年04月14日
    瀏覽(22)
  • linux入門之進程控制(上)進程創(chuàng)建,進程等待

    linux入門之進程控制(上)進程創(chuàng)建,進程等待

    目錄 一、進程創(chuàng)建 1.fork函數 2.fork函數返回值 3.寫時拷貝 4.fork常規(guī)用法 5.fork調用失敗原因 二、進程終止 1.進程退出場景 2.進程常見退出方法 2.1_exit函數(直接調用內核) 2.2 exit函數 2.3return退出 三、進程等待 1.進程等待必要性 2.進程等待方法 2.1 wait方法 2.2 waitpid方法 2.3獲取

    2024年02月12日
    瀏覽(21)
  • 零基礎Linux_10(進程)進程終止(main函數的返回值)+進程等待

    零基礎Linux_10(進程)進程終止(main函數的返回值)+進程等待

    目錄 1. 進程終止 1.1 main函數的返回值 1.2?進程退出碼和錯誤碼 1.3 進程終止的常見方法 2. 進程等待 2.1 進程等待的原因 2.2?wait?函數 2.3 waitpid 函數 2.4?int* status參數 2.5?int options非阻塞等待 本篇完。 進程終止指的就是程序執(zhí)行結束了,進程終止退出的場景有三種: 代碼運行

    2024年02月07日
    瀏覽(20)
  • 【Linux】進程等待和替換——進程等待的原理、wait/waitpid方法、進程程序替換、進程替換原理、替換函數

    【Linux】進程等待和替換——進程等待的原理、wait/waitpid方法、進程程序替換、進程替換原理、替換函數

    1.1進程等待的概念 ?? 進程等待指的是父進程等待子進程退出,以獲取子進程的退出返回值,并釋放子進程占用的資源。 ?? 當子進程先于父進程退出,但父進程沒有關注子進程的退出狀態(tài)時, 子進程會為了保存自己的退出狀態(tài)而保持資源占用, 這種情況被稱為“僵尸進

    2024年02月04日
    瀏覽(18)
  • 【Linux筆記】進程等待與程序替換

    【Linux筆記】進程等待與程序替換

    在講解進程的終止之前,先要普及一下進程的退出碼概念。 我們父進程之所以要創(chuàng)建子進程,就是為了讓子進程運行不一樣的任務,那么對于子進程執(zhí)行的這個任務執(zhí)行完畢后的結果是否正確或者是否出差錯,我們父進程要對這個結果進行驗收。 從而就引出了進程退出碼和

    2024年01月21日
    瀏覽(17)
  • 【Linux系統(tǒng)編程:線程】 線程控制 -- 創(chuàng)建、終止、等待、分離 | 線程互斥與同步 | 互斥量與條件變量 | 生產者消費者模型 | 線程池 | STL/智能指針與線程安全 | 讀者寫者模型

    【Linux系統(tǒng)編程:線程】 線程控制 -- 創(chuàng)建、終止、等待、分離 | 線程互斥與同步 | 互斥量與條件變量 | 生產者消費者模型 | 線程池 | STL/智能指針與線程安全 | 讀者寫者模型

    寫在前面 本文重點: 了解線程概念,理解線程與進程區(qū)別與聯系。 學會線程控制,線程創(chuàng)建,線程終止,線程等待。 了解線程分離與線程安全。 學會線程同步。 學會使用互斥量,條件變量,posix 信號量,以及讀寫鎖。 理解基于讀寫鎖的讀者寫者問題。 一、線程概念 ??

    2024年02月04日
    瀏覽(104)
  • Linux——進程創(chuàng)建與進程終止

    Linux——進程創(chuàng)建與進程終止

    ??北塵_ :個人主頁 ??個人專欄 :《Linux操作系統(tǒng)》《經典算法試題 》《C++》 《數據結構與算法》 ??走在路上,不忘來時的初心 在linux中fork函數時非常重要的函數,它從已存在進程中創(chuàng)建一個新進程。新進程為子進程,而原進程為父進程。 #include unistd.h pid_t fork(void); 返

    2024年02月04日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包