[お勉強] プロセスを生成する〜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
うーむ.自由度が高いし,使いやすい.