exec函數(shù)記錄

exec簡介:

exec家族的函數(shù),用來運(yùn)行新的進(jìn)程替換當(dāng)前的進(jìn)程。執(zhí)行后,新進(jìn)程加載到內(nèi)存,父進(jìn)程的靜態(tài)變量在新的進(jìn)程中當(dāng)然是不可見。新進(jìn)程可以繼承父進(jìn)程的句柄和環(huán)境變量,用戶組。

示例

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

int g_value = 0;
int main(int argc, char **argv) 
{
    if (argc > 1 && strcmp(argv[1], "child") == 0) {
        printf("child g_value = %d\n", g_value);
        return 0;
    }
    g_value = 1;
    printf("father g_value = %d\n", g_value);
    int fd = open("/root/source/test.txt", O_RDWR);
    printf("father fd = %d\n", fd);
    dup2(fd, 1);
    close(fd);
    execl("/root/source/cmd", "cmd", "child", NULL);
    printf("run child failed\n");
    return 0;
}

如上代碼編譯一個(gè)cmd的二進(jìn)制,執(zhí)行cmd命令,
1、父進(jìn)程將g_value 賦值為1,子進(jìn)程中g(shù)_value 依然為0,子進(jìn)程不會繼承父進(jìn)程的變量。
2、將標(biāo)準(zhǔn)輸出的句柄綁定到/root/source/test.txt句柄。子進(jìn)程的句柄依然指向/root/source/test.txt,子進(jìn)程可以繼承父進(jìn)程的句柄。

root@yisu-66a113137e504:~/source# ./cmd
father g_value = 1
father fd = 3
root@yisu-66a113137e504:~/source# 
root@yisu-66a113137e504:~/source# cat test.txt 
child g_value = 0

這里順帶提一下fork,fork功能是創(chuàng)建一個(gè)新的進(jìn)程,子進(jìn)程獲得父進(jìn)程代碼段和數(shù)據(jù)段的副本(雖然在現(xiàn)代系統(tǒng)中,通常使用寫時(shí)復(fù)制技術(shù)來優(yōu)化內(nèi)存使用)。子進(jìn)程繼承父進(jìn)程的資源限制(如文件大小限制、CPU 時(shí)間限制等)。
fork和execv的組合可實(shí)現(xiàn)子進(jìn)程的管理,如fork創(chuàng)建一個(gè)新的進(jìn)程,設(shè)置它的uid,gid后,再執(zhí)行execv切換新進(jìn)程替換當(dāng)前進(jìn)程。

android service啟動

android service啟動,使用到了fork 和 execv:

Result<void> Service::Start() {
    //....
    pid = fork();
   if (pid == 0) {
         RunService(...); // 其中執(zhí)行 execv 加載新的程序,并設(shè)
   }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大師兄的Python學(xué)習(xí)筆記(四): Python的內(nèi)置函數(shù)大師兄的Python學(xué)習(xí)筆記(六): 常用庫之sys包...
    superkmi閱讀 2,060評論 0 52
  • exec 曾提及用fork函數(shù)創(chuàng)建新的子進(jìn)程后,子進(jìn)程往往要調(diào)用一種exec函數(shù)以執(zhí)行另一個(gè)程序。當(dāng)進(jìn)程調(diào)用一種e...
    MachinePlay閱讀 2,136評論 0 0
  • fork()函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個(gè)與原來進(jìn)程(父進(jìn)程)幾乎完全相同的進(jìn)程(子進(jìn)程是父進(jìn)程的副本,它將獲得父進(jìn)程數(shù)...
    飯飯H閱讀 1,129評論 0 0
  • 1.創(chuàng)建進(jìn)程 fork函數(shù)創(chuàng)建進(jìn)程 注意:1.創(chuàng)建成功時(shí)候,父進(jìn)程返回子進(jìn)程的進(jìn)程號,子進(jìn)程返回02.通過fork...
    Meiyangyang945閱讀 494評論 2 1
  • fork() fork()將父進(jìn)程復(fù)制一份子進(jìn)程, 在子進(jìn)程中從fork()調(diào)用處繼續(xù)執(zhí)行, 之后的代碼在父子進(jìn)程...
    D_Major閱讀 3,099評論 0 0

友情鏈接更多精彩內(nèi)容