execシリーズ(execl execlp execv execvp)


目次に戻る


昨日取り上げたfork()とからんできます。Windowsでもexec関数をサポートしていますが、 forkと絡むのでUNIXよりです。
 
exec関数は「今走っているプログラムをそこで終了させ他のプログラムを実行する」 ような関数だと思ってくれればOKです。execl,execv,の差は引数の渡し方の違いで、最後 にpがつくとパス通ったディレクトリに該当するプログラムがあるか検索して実行します。
/* テストプログラム */
int main()
{
    printf("start!\n");
    execlp("ls","ls","-al",NULL);
    printf("end!\n");
    return 0;
}
上のテストプログラムを実行すると、"start!"は表示されても"end!"は表示されません。こ れは、execlp関数を呼び出した時点でテストプログラムは終了し、lsプログラムが実行さ れるからです。(ただし、lsコマンドが無い等の理由でexeclp関数が失敗すると"end!"が表 示されます)
 
exec関数はたいていfork関数と併せて使用します。そうしないと、別のプログラムを 実行させると今動いているプログラムが終了してしまうからです。
int pid;

sigignore( SIGCLD ); /*子プロセスは勝手に死亡するようにする(forkを使うときのお まじない。そのうち解説します)*/

if( (pid=fork()) < 0 ){
    /* fork 失敗よ〜 */
    return -1;
} else if( pid == 0 ){
    /* 新しく起動した子プロセスに処理させたい内容 */

    execlp("ls","ls","-al",NULL);

    /* execlp失敗 */

    exit( -1 );    /* 子プロセス異常終了 */
}

/* 親プロセスの処理 */

forkと併せて利用した例は上のような感じになります。forkとexec関数を使用すればラン チャー(他のプログラムを簡単に起動させるソフト)のような物をすぐに作ることができま す。
 
でも、これで満足してはいけません。forkとexecを使っただけでは、exec関数で起動 したプログラムがどういった反応をしたのかだとか、exec関数で起動したプログラムに何 かデータを渡すとかができません。(本当はできるけど、面倒くさい)
 
そこで、pipe関数の登場です。続きはまた明日。
 

目次に戻る