スポンサード リンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサード リンク
-- : -- : -- | スポンサー広告 | page top↑
スポンサード リンク

exec族の関数:プロセスの変身

execl(), execlp(), execle(), execv(), execvp(), execve()は、「exec族」や「execファミリー」と呼ばれ、指定した新しいプロセスで現在のプロセスを置き換えるプロセスイメージを置き換える関数です。平たく言うと、execしたプロセス(プログラム)は新しいプロセスに変身します。

ここでは、execlp()関数を用いたサンプルプログラムを紹介します。

#include <unistd.h>

extern char **environ;

int execlp(const char *file, const char *arg, ...);

このエントリには予備知識編「system関数:新しいプロセスの作成」が存在しますので、先にそちらをご覧いただけたらと思います。

#include <unistd.h>
#include <stdio.h>

int main() {
  printf("Running ps with execlp\n");
  execlp("ps", "ps", NULL);
  printf("Done.\n");
  return 0;
}

上のプログラムはexeclp()関数を用いてpsコマンドを起動するプログラムです。引数には起動するファイル名"ps"と可変長引数を終端するNULLを渡しています。

このプログラムを実行すると下のような出力が得られます。

****@ubuntu-vm:~/work/os$ ./exec_ps
Running ps with execlp
  PID TTY          TIME CMD
11588 pts/0    00:00:06 bash
15496 pts/0    00:00:01 emacs
19478 pts/0    00:00:00 ps
****@ubuntu-vm:~/work/os$

この出力結果には注目すべき点が3つあります。

1つは新しいシェルが起動せずにpsが実行されていることです。これはsystem()関数と比較したときの利点であります。(*1)

2つ目はpsで出力される現在稼働中のプロセスの中に自分(exec_ps)自身がいないことです。これは、execlp()関数でpsに変身してしまったためです。

そして、最後の1つは、"Done."が出力されずにプログラムが終了していることです。これは、プログラムの7行目で"Done.\n"をprintf()する前の行でexeclp()して、別のプログラム(プロセス)psに変身してしまっているためです。変身後はプロセスが完全に置き換わってしまい、もとに戻ることがないため、execlp()より下の行は実行されません。

応用
exec族の関数と、いくつかのシステムコール(fork()など)を組み合わせることによって、以前のエントリ「UNIXシステムプログラミング-簡易シェルの実装」で紹介したような簡単なシェルを作ることができます!

参考にした本
Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべてLinuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて
ニール マシュー リチャード ストーンズ Neil Matthew

ソフトバンククリエイティブ 2004-08
売り上げランキング : 141253
おすすめ平均

Amazonで詳しく見る
by G-Tools

*1: system()関数については予備知識編「system関数:新しいプロセスの作成」)を参照して下さい)


スポンサード リンク

テーマ:プログラミング - ジャンル:コンピュータ - ソーシャルブックマーク: この記事をクリップ! Yahoo!ブックマークに登録

23 : 01 : 13 | プログラミング-UNIX | トラックバック(0) | コメント(0) | page top↑
<<Scilab超入門 第1回 Scilabのインストールと簡単な使い方 | ホーム | 自然言語検索Powersetに空が青い理由を聞いてみた。>>
コメント

コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
http://networkprogramming.blog18.fc2.com/tb.php/44-7adc3de0
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |

プロフィール

TBVector

Author:TBVector

プロフィール

メールフォーム

記事検索

Google

最近の記事

人気の記事

過去の記事

カテゴリー

タグランキング

リンク

最近のコメント

最近のトラックバック

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。