Linux-exc関数族とsystem関数


自分で1段のLinuxの下のコードがあって、exec関数とsystem関数を使う必要があって、CSDNの上でこのように1篇の悪くない招待状を見て、転載してきます.
原文のURL:http://blog.csdn.net/cnctloveyu/article/details/4129520
 
exec関数族は6つの関数を含みます.
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, const char *envp[]);
int execv(const char *path, const char *argv[]);
int execve(const char *path, const char *argv[], const char *envp[];
int execvp(const char *file, const char *argv[]);
パラメータの説明:
execlの最初のパラメータは、パスを含む実行可能ファイルであり、後はリストパラメータであり、リストの最初はコマンドパスであり、次にパラメータリストであり、最後はNULLで終了しなければならない.execlpの最初のパラメータは、相対パスまたは絶対パスを使用することができる.execleには、最後にユーザー定義環境変数リストを指すポインタが含まれています.このリストはNULLで終了しなければなりません.execv、vは、pathの後に受信されるベクトル、すなわち、パラメータリストを指すポインタを表し、このリストの最後の項目はNULLでなければならないことに注意する.execve、pathの後にパラメータリストベクトルを受信し、環境変数リストベクトルを指定できます.execvpでは、最初のパラメータは相対パスまたは絶対パスを使用してもよく、vは後にパラメータリストベクトルを受信することを表しています.    execが呼び出された時に、そのプロセスのコードセグメントとデータセグメントを交替します.(ただし、ファイルのディスクリプタは不変です.)、直接に呼び出されたプロセスの親プロセスに戻ります.エラーが発生したら、-1に戻り、errnoを設定します.
例:
#include <unistd.h>
int main(int argc, char *argv[])
{
         char *envp[]={"PATH=/tmp", "USER=lei", "STATUS=testing", NULL};
         char *argv_execv[]={"echo", "excuted by execv", NULL};
         char *argv_execvp[]={"echo", "executed by execvp", NULL};
         char *argv_execve[]={"env", NULL};
         if(fork()==0) {
                 if(execl("/bin/echo", "echo", "executed by execl", NULL)<0)
                         perror("Err on execl");
         }
         if(fork()==0) {
                 if(execlp("echo", "echo", "executed by execlp", NULL)<0)
                         perror("Err on execlp");
         }
         if(fork()==0) {
                 if(execle("/usr/bin/env", "env", NULL, envp)<0)
                         perror("Err on execle");
         }
         if(fork()==0) {
                 if(execv("/bin/echo", argv_execv)<0)
                         perror("Err on execv");
         }
         if(fork()==0) {
                 if(execvp("echo", argv_execvp)<0)
                         perror("Err on execvp");
         }
         if(fork()==0) {
                 if(execve("/usr/bin/env", argv_execve, envp)<0)
                         perror("Err on execve");
         }
}
 
プログラムでは、Linuxでよく使われる2つのシステムコマンド、echo、envを呼び出します.echoは後のコマンドラインのパラメータをそのまま印刷します.envはすべての環境変数を一覧表示します.    各サブルーチンの実行順序が制御できないため、各サブルーチンの印刷結果が複雑になり、厳密にはプログラムに記載されている順序ではない.最も一般的なエラー:    通常のプログラミングで、exec関数族を使ったら、間違い判定文を必ず入れてください.他のシステムの呼び出しに比べて、execは傷つきやすく、実行されたファイルの位置、権限など多くの要素が呼び出されて失敗してしまいます.    最も一般的なエラーは、    1)ファイルまたはパスが見つからない場合、errnoはENOENTに設定されます.    2)配列argvとenvpをNULLで忘れてしまいました.このときerrnoはEFAULTに設定されます.    3)ファイルを実行する実行権限がない場合、errnoはEACCESに設定されます.
system関数:
プロトタイプ:
#include <stdlib.h>
int system (const char *string);
機能:The system function runs the command passed to it as string and wait to complette.The command is executed as the command sh−c string has been givent to a shell.【つまり、systemはshellを使用して起動する指定プログラム】
例:
#include <stdlib.h>
#include <stdio.h>
int main()
{
    printf("Running ps with system/n");
    system("ps −ax");
    printf("Done./n");
    exit(0);
}