linux cプログラミングexc関数族


exec関数族
1.exec()関数族が現在のプロセスイメージを新しいプロセスイメージに置き換えることを説明します.プロセスIDは変わりません.2.規律exec関数族の名前は近く、使用も近いです.それらの一般的な法則は以下の通りです.l(list)コマンドラインパラメータリストp(path)検索酵素fileの場合は、path変数v(vector)を使用してコマンドラインパラメータ配列e(environment)を使用して環境変数配列を使用し、プロセスの元の環境変数を使用せずに、新しいロードプログラムが実行する環境変数を設定します.
  • バンドのlのexec関数は、このような関数があります.execl、execlp、execleは、後のパラメータが可変パラメータとして与えられ、すべて空のポインタで終わることを示します.ここで特に説明するのは、プログラム名もパラメータですので、最初のパラメータはプログラム名です.
  • バンドpのexec関数には、このような関数があります.execlp、execvpは具体的に説明しています.最初のパラメータは具体的なパスを与える必要がなく、関数名を与えさえすればいいです.システムはPATH環境変数の中で対応するプログラムを探しています.見つけられなかったら-1に戻ります.
  • バンドvのexec関数のこのような関数は、execv、execvpによって具体的に説明されています.コマンドに必要なパラメータがchar*arg[]で与えられ、argの最後の要素はNULL
  • でなければなりません.
  • のeバンドのexec関数は、このような関数があります.execleは、環境変数を交換が必要なプロセスに伝達し、元の環境変数は再機能しません.
  • Linuxアプリケーションからのプログラミングを参照してください.
    3.ヘッダファイル
    #include 
    extern char **environ;
    
    4.声明
    int execl(const char *path, const char *arg, ...
                           /* (char  *) NULL */);
    int execlp(const char *file, const char *arg, ...
                           /* (char  *) NULL */);
    int execle(const char *path, const char *arg, ...
                           /*, (char *) NULL, 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[]);
    
    
    5.パラメータ
    int execl(const char *path, const char *arg, ...
                           /* (char  *) NULL */);
    /*
    path      
    arg             ,     , NULL  
    */
    
    int execlp(const char *file, const char *arg, ...
                           /* (char  *) NULL */);
    /*
    file    ,   path  
    arg             ,     , NULL  
    */
    
    int execle(const char *path, const char *arg, ...
                           /*, (char *) NULL, char * const envp[] */);
    /*
    path        
    arg               ,     , NULL  
    envp[]        ,           , NULL  
    */
    
    int execv(const char *path, char *const argv[]);
    /*
    path        
    argv[]                
    */
    
    int execvp(const char *file, char *const argv[]);
    /*
    file      ,   path  
    argv[]                
    */
    
    int execvpe(const char *file, char *const argv[],char *const envp[]);
    /*
    file      ,   path  
    argv[]                
    envp[]        ,           , NULL  
    */
    
    6.戻り値exec関数族はエラーが発生した時のみ戻ります.は-1の値を返し、errnoを適切に設定します.
    7.例
    1.l付きのexec関数
    このような関数は、execl、execlp、execleです.
    具体的な説明:後ろのパラメータは可変パラメータで与えられ、全部一つの空のポインタで終わることを示します.ここで特に説明するのは、プログラム名もパラメータですので、最初のパラメータはプログラム名です.
    #include 
    #include 
     
    int main()
    {
    	printf("process begin...
    "
    ); execl("/bin/ls", "ls", NULL); printf("process end...
    "
    ); return 0; }
    2.p付きのexec関数
    このような関数は、execlp、execvpです.
    具体的な説明:最初のパラメータは具体的なパスを与える必要がないことを示しています.関数名を与えさえすれば、システムはPATH環境変数の中で対応するプログラムを探しています.見つからなかったら-1に戻ります.
    #include 
    #include 
     
    int main()
    {
    	printf("process begin...
    "
    ); execlp("ls", "ls", "-l", NULL); printf("process end...
    "
    ); return 0; }
    3.v付きのexec関数
    このような関数は、execv、execvpです.
    具体的な説明:コマンドを表すために必要なパラメータはchar*arg[]で与えられ、argの最後の要素はNULLでなければならない.
    #include 
    #include 
     
    int main()
    {
    	printf("process begin...
    "
    ); char *argv[] = {"ls", "-a", "-l", NULL}; execvp("ls", argv); printf("process end...
    "
    ); return 0; }
    4.eを持つexec関数
    このような関数は、execleです.
    具体的な説明:環境変数を交換が必要なプロセスに伝達しても、元の環境変数は機能しません.
    //execle  
     
    #include 
    #include 
     
    int main()
    {
    	printf("process begin...
    "
    ); char *envp[] = {"AA=11", "BB=22", NULL}; execle("./env", "env", NULL, envp); printf("process end...
    "
    ); return 0; }
    8.注意着信プログラムのパラメータの中で、arg[0]はプログラムの名前が一般的ですので、fileパラメータはarg[0]と同じです.しかし、exec関数族では、arg[0]という位置を自由に書いても問題がないので、実行されるプログラムは一般的にarg[0]というパラメータは使用されないと思いますが、パラメータが使用されると影響があります.