2011-06-30 8 views
1

私はsystem()コールを使って "tail -f"を開始しています。 manページが言うように 1)SH -c尾ファイル名 2)尾のファイル名システム()呼び出しの振る舞い

::私が見た

ことの一つは、尾の呼び出しは、2つのプロセス(私はPSで見ることができますが)かかり、ということであったシステムを()コマンドで指定されたコマンドを/ bin/sh -cコマンドを呼び出して実行します。私は、プロセス1)は避けられない、正しいと思いますか?

私が2から1

に事前に

感謝のプロセスの数を減らすことができれば私は思っていました。

+1

することができますはい、 'システム(「」)';) –

+1

あなたの質問のタイトルについてだけ好き嫌いのコメント:システムは、()システムコールが、Cライブラリ関数ではありません。 – jlliagre

+0

@jlliagre:非常に有効 - タイトルが更新されました。 – hari

答えて

3

システムは常にsh -cコマンドを実行します。 1つのプロセスだけが必要な場合は、system( "exec tail -f")を実行します。

+0

ありがとう、しかし私の現在のプログラム(私は尾を呼び出すから)を食べることはありませんか? – hari

+0

いいえ、それは現在のプログラムを食べていません。ありがとうたくさん:) – hari

+0

いいえ、それはシェルを食べるだけです。 –

4

fork()/exec()を使用してプロセスを起動することをお勧めします。 system()はシェルを起動するので、渡すものに注意してください。

/* Untested code, but you get the idea */ 
switch ((pid = fork())) { 
case -1: 
    perror("fork"); 
    break; 
case 0: 
    execl("/usr/bin/tail", "tail", "-f", filename); 
    perror("execl"); 
    exit(1); 
default: 
    wait(pid); 
    ... 
} 
+1

case 0がexit(1)ではなく_exit(1)を呼び出す必要があることを除いて、非常に良いです。 – Joshua

+0

待機の署名は 'pid_t wait(int * status)'です。その特定のpidだけを待つ場合は、 'waitpid'を使う必要があります。 – Staven