[お勉強] プロセスを生成する〜system
まず,system関数を使ってみる.
これは,一番簡単かもしれない.
中身は/bin/sh -c コマンド名でシェル経由でプロセスを生成しているようである.
まず,外部アプリケーションとなるhogeのhoge.cを以下に示す.
#include <stdio.h>
int main( int argc, void**argv ) {
int i = 0;
for( i = 0; i < 10; i++ ) {
printf( "%d sec passed.\n", i );
sleep( 1 );
}
printf( "hoge has finished.\n" );
return 0;
}
たんに1秒間待つ処理を10回繰り返すだけのもの.
それをsystem関数を使って起動するsystemのsystem.cを以下に示す.
#include <stdio.h>
int main( int argc, void**argv ) {
system( "../hoge/hoge" );
printf( "system has finished.\n" );
}
このsystemを実行するとhogeのプロセスが生成され,実行される.
実行結果は,以下のようになる.
$ ./system 0 sec passed. 1 sec passed. 2 sec passed. 3 sec passed. 4 sec passed. 5 sec passed. 6 sec passed. 7 sec passed. 8 sec passed. 9 sec passed. hoge has finished. system has finished.
プロセスは,以下のように見える.
sonson 8753 0.0 0.0 599616 296 s001 S+ 10:53AM 0:00.00 ../hoge/hoge sonson 8752 0.0 0.0 591424 284 s001 S+ 10:53AM 0:00.00 ../system/system
system関数は,バックグラウンドで動かさない場合は,親プロセスは,子プロセスが終わるのを待つようである.
system関数は,ワイルドカードなども使えるらしい.
並列処理も実は,&で簡単に実現できてしまう.
#include <stdio.h>
int main( int argc, void**argv ) {
system( "../hoge/hoge &" );
printf( "system has finished.\n" );
}
こうやって,バッググラウンドでhogeを起動すると,以下のような実行結果になる.
$ ./system system has finished. $ 0 sec passed. 1 sec passed. 2 sec passed. 3 sec passed. 4 sec passed. 5 sec passed. 6 sec passed. 7 sec passed. 8 sec passed. 9 sec passed. hoge has finished.
プロセスは,以下.プロセス番号をつかえまえるために,getcharをしこんで,データを取った.
状態にS+とSで差がみられる.
sonson 8797 0.0 0.0 599616 284 s001 S+ 10:55AM 0:00.00 ./system sonson 8800 0.0 0.0 599616 296 s001 S 10:56AM 0:00.00 ../hoge/hoge
うーむ.自由度が高いし,使いやすい.