Linux-exc関数族とsystem関数
自分で1段のLinuxの下のコードがあって、exec関数とsystem関数を使う必要があって、CSDNの上でこのように1篇の悪くない招待状を見て、転載してきます.
原文のURL:http://blog.csdn.net/cnctloveyu/article/details/4129520
exec関数族は6つの関数を含みます.
execlの最初のパラメータは、パスを含む実行可能ファイルであり、後はリストパラメータであり、リストの最初はコマンドパスであり、次にパラメータリストであり、最後はNULLで終了しなければならない.execlpの最初のパラメータは、相対パスまたは絶対パスを使用することができる.execleには、最後にユーザー定義環境変数リストを指すポインタが含まれています.このリストはNULLで終了しなければなりません.execv、vは、pathの後に受信されるベクトル、すなわち、パラメータリストを指すポインタを表し、このリストの最後の項目はNULLでなければならないことに注意する.execve、pathの後にパラメータリストベクトルを受信し、環境変数リストベクトルを指定できます.execvpでは、最初のパラメータは相対パスまたは絶対パスを使用してもよく、vは後にパラメータリストベクトルを受信することを表しています. execが呼び出された時に、そのプロセスのコードセグメントとデータセグメントを交替します.(ただし、ファイルのディスクリプタは不変です.)、直接に呼び出されたプロセスの親プロセスに戻ります.エラーが発生したら、-1に戻り、errnoを設定します.
例:
プログラムでは、Linuxでよく使われる2つのシステムコマンド、echo、envを呼び出します.echoは後のコマンドラインのパラメータをそのまま印刷します.envはすべての環境変数を一覧表示します. 各サブルーチンの実行順序が制御できないため、各サブルーチンの印刷結果が複雑になり、厳密にはプログラムに記載されている順序ではない.最も一般的なエラー: 通常のプログラミングで、exec関数族を使ったら、間違い判定文を必ず入れてください.他のシステムの呼び出しに比べて、execは傷つきやすく、実行されたファイルの位置、権限など多くの要素が呼び出されて失敗してしまいます. 最も一般的なエラーは、 1)ファイルまたはパスが見つからない場合、errnoはENOENTに設定されます. 2)配列argvとenvpをNULLで忘れてしまいました.このときerrnoはEFAULTに設定されます. 3)ファイルを実行する実行権限がない場合、errnoはEACCESに設定されます.
system関数:
プロトタイプ:
例:
原文の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);
}