日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux进程全解8——exec 族函数

發布時間:2023/12/20 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程全解8——exec 族函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容源于朱有鵬《物聯網大講堂》的課程學習整理,如有侵權,請告知刪除。


1、為什么需要exec函數?

(1)fork子進程是為了執行新程序

  • fork創建子進程后,子進程和父進程同時被OS調度執行;
  • 因此子進程可以獨立地執行一個程序,這個程序宏觀上將會和父進程程序同時進行。

(2)可以直接在子進程的if(){ }中寫入新程序的代碼

  • 但是這樣不夠靈活,因為我們只能把子進程程序的源代碼貼過來執行(必須知道源代碼,而且源代碼太長了也不好控制);
  • 譬如說我們希望子進程來執行ls -la 命令就不行了(因為沒有源代碼,只有編譯好的可執行程序)。

(3)使用exec族運行新的可執行程序

  • exec族函數可以直接把一個編譯好的可執行程序直接加載運行。

(4)有了exec族函數后,典型的父子進程程序如下

  • 首先項目是一個多進程項目;
  • (子進程需要運行的)程序被單獨編寫、單獨編譯連接成一個可執行程序(叫hello);
  • 主程序為父進程,fork創建子進程后,在子進程中使用exec來執行hello;
  • 這樣就達到了父子進程分別運行不同程序,但(宏觀上)同時運行的效果。


2、exec族的6個函數介紹

(1)execl和execv

  • 這兩個函數是最基本的exec,都可以用來執行一個程序,區別是傳參的格式不同。
  • execl是把參數列表(本質上是多個字符串,必須以NULL結尾)依次排列而成(l其實就是list的縮寫)。
  • execv是把參數列表事先放入一個字符串數組中,再把這個字符串數組傳給execv函數。

(2)execlp和execvp

  • 這兩個函數在上面2個基礎上加了p
  • 上面2個執行程序時必須指定可執行程序的全路徑(如果exec沒有找到path對應的文件則直接報錯)。
  • 這里加了p的兩個函數,傳遞的可以是file,也可以是path,只不過兼容了file。
  • 這兩個函數會首先去找file,如果找到則執行執行,如果沒找到則會去環境變量PATH所指定的目錄下去找,如果找到則執行,如果沒找到則報錯。

(3)execle和execvpe

  • 這兩個函數較基本exec來說加了e,函數的參數列表中也多了一個字符串數組envp形參;
  • e表示environment(環境變量),和基本版本的exec的區別在于,執行可執行程序時會多傳一個環境變量的字符串數組給待執行的程序。

3、execl和execv實戰

(1)使用execl運行ls -l -a

(2)使用execv運行ls

(3)使用execl運行自己寫的程序


4、execlp和execvp實戰

  • 不加p時需要全部路徑+文件名,如果找不到就報錯了。
  • 加了p之后會到PATH所指定的路徑下去找一下。

5、execle和execvpe實戰

(1)main函數的原型其實不止是int main(int argc, char **argv),而可以是

  • int main(int argc, char **argv, char **env)第三個參數是一個字符串數組,內容是環境變量。

#include <stdio.h>// env就是我們給main函數額外傳遞的環境變量字符串數組 int main(int argc, char **argv, char **env) {int i = 0;printf("argc = %d.\n", argc);while (NULL != argv[i]){printf("argv[%d] = %s\n", i, argv[i]);i++;}i = 0;while (NULL != env[i]){printf("env[%d] = %s\n", i, env[i]);i++;}return 0; }

(2)如果用戶在執行這個程序時沒有傳遞第三個參數,則程序會自動從父進程繼承一份環境變量(默認的,最早來源于OS中的環境變量);

  • 如果使用execlp或者execvpe去傳遞一個envp數組,則程序中的實際環境變量是我們傳遞的這一份(取代了默認的從父進程繼承來的那一份)


#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h>int main(void) {pid_t pid = -1;pid_t ret = -1;int status = -1;pid = fork();if (pid > 0){// 父進程printf("parent, 子進程id = %d.\n", pid);}else if (pid == 0){// 子進程//execl("/bin/ls", "ls", "-l", "-a", NULL); // ls -l -a//char * const arg[] = {"ls", "-l", "-a", NULL};//execv("/bin/ls", arg);//execl("hello", "aaa", "bbb", NULL);//char * const arg[] = {"aaa", "bbb", NULL};//execv("hello", arg);//execlp("ls", "ls", "-l", "-a", NULL); char * const envp[] = {"AA=aaaa", "XX=abcd", NULL};execle("hello", "hello", "-l", "-a", NULL, envp);return 0;}else{perror("fork");return -1;}return 0; }

總結

以上是生活随笔為你收集整理的Linux进程全解8——exec 族函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。