嵌入式 Linux進程間通信(二)——exec族函數

分類:IT技術 時間:2016-10-09

嵌入式 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[]);

    execlexecv區別在於參數傳遞方式不同,execl將參數存放在一個列表中,execv將參數存放在一個字符串數組中。execlpexecvp增加了文件查找的路徑,優先查找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數組argvenvp忘記用NULL結束,此時errno被設置為EFAULT

C沒有對要執行文件的運行權限,此時errno被設置為EACCES

 

本文出自 “生命不息,奮鬥不止” 博客,轉載請與作者聯系!


Tags: include 執行文件 return 嵌入式 二進制

文章來源:


ads
ads

相關文章
ads

相關文章

ad