目錄
- 簡介
- 函數原型
- 參數說明
- 返回值
- 函數區別
- 使用示例
- 采用參數列表傳遞參數,以 execl 為例
- 采用參數數組傳遞參數,以 execv 為例
- 調用 PATH 下可執行文件,以 execlp 為例
- 使用新的環境變量給新進程,以 execle 為例
- 更多內容
簡介
exec 函數族是 Linux 系統中的系統調用函數,它們都以 exec 開頭,共有 6 個,分別是 execl
、execle
、execlp
、execv
、execve
、execvp
,使用 exec 函數可以將當前的進程替換為一個新進程,且新進程與原進程具有相同的 PID。
函數原型
#include <unistd.h>extern char **environ;int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
參數說明
path
:指定要執行的可執行文件及其路徑,可以是相對路徑、也可以是絕對路徑。arg
:指定傳遞給可執行文件的一系列參數,以可變參數列表的形式,一般第一個參數為可執行文件的名稱,且最后一個參數必須是NULL
。file
:若參數中包含"/
"則視為路徑并在指定路徑下查找可執行文件,否則將在PATH
環境變量指定的路徑中查找可執行文件。envp
:指定新進程的環境變量,不使用當前的環境變量。argv
:指定傳遞給可執行文件的一系列參數,以參數數組的形式,且該數組最后一個元素必須是NULL
。
返回值
- 成功:不返回,從新程序的 main 函數開始執行。
- 失敗:返回 -1,繼續執行原程序。
函數區別
分別以函數中的字符 l
、p
、v
、e
說明:
l
:表示使用參數列表的形式傳遞參數。p
:表示使用文件名,若不指定路徑,將在 PATH 環境變量指定的路徑中查找可執行文件。v
:表示使用參數數組的形式傳遞參數。e
:表示要使用新的環境變量給新進程。
使用示例
采用參數列表傳遞參數,以 execl 為例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{printf("--- main begin ---\n");execl("./test", "test", "Hello World!", (char *)NULL);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);return 0;
}
- 執行效果如下:
采用參數數組傳遞參數,以 execv 為例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{char *argv[] = {"test", "Hello World!", (char *)NULL};printf("--- main begin ---\n");execv("./test", argv);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);return 0;
}
- 執行效果如下:
調用 PATH 下可執行文件,以 execlp 為例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{printf("--- main begin ---\n");execlp("ps", "ps", "-l", (char *)NULL);printf("--- main end ---\n");return 0;
}
- 執行效果如下:
使用新的環境變量給新進程,以 execle 為例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{char *env_init[] = {"AA=aa", "BB=bb", NULL};printf("--- main begin ---\n");execle("./test", "test", "Hello World!", (char *)NULL, env_init);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>extern char **environ;int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);for (char **ptr = environ; *ptr != 0; ptr++){printf("%s\n", *ptr);}return 0;
}
- 執行效果如下:
更多內容
- CSDN博客:@Hello阿爾法
- 嗶哩嗶哩:@Hello阿爾法
- 知乎:@Hello阿爾法