嵌入式 linux進程間通信(二)——exec族函數
exec函數族的作用是根據指定的文件名找到可執行文件,並用它來取代調用進程的內容,換句話說,就是在調用進程內部執行一個可執行文件。這裏的可執行文件既可以是二進制文件,也可以是任何Linux下可執行的腳本文件。
exec族函數包含如下函數:
#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[]);
execl與execv區別在於參數傳遞方式不同,execl將參數存放在一個列表中,execv將參數存放在一個字符串數組中。execlp和execvp增加了文件查找的路徑,優先查找path參數的文件,找不到則到環境變量PATH中去查找。execle增加了給可執行程序傳遞環境變量的字符串數組。
函數使用示例:
execl("/bin/ls", "ls", "-a", "-l", NULL);
char *const arg[] = {"ls", "-l", "-a", NULL};
execv("/bin/ls", arg);
execvp("ls",arg);
execle使用實例:
exec.c:編譯生成exec
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
char *const envp[] = {"name=scorpio", "host=192.168.6.200", NULL};
execle("./hello", "hello", NULL, envp);
return 0;
}
hello.c:編譯生成hello
#include <stdio.h>
#include <unistd.h>
extern char **environ;
int main(int argc, char **argv)
{
printf("hello\n");
int i = 0;
for(i = 0; environ[i] != NULL; i++)
{
printf("%s\n", environ[i]);
}
return 0;
}
運行./exec:
hello
name=scorpio
host=192.168.6.200
exec程序中定義的環境變量傳遞給了調用的hello程序。
常見錯誤:
A、找不到文件或路徑,此時errno 被設置為ENOENT
B、數組argv和envp忘記用NULL結束,此時errno被設置為EFAULT
C、沒有對要執行文件的運行權限,此時errno被設置為EACCES
本文出自 “生命不息,奮鬥不止” 博客,轉載請與作者聯系!
Tags: include 執行文件 return 嵌入式 二進制
文章來源: