- ベストアンサー
system関数について
cygwinでC言語を勉強しています。 そして昨日system関数の存在を知ったのでこんなプログラムを書いて見ました。 #include <stdio.h> #include <stdlib.h> main() { system("pwd"); system("cd .."); system("pwd"); } すると、結果は /home/prg/ /home/prg/ となりました。"cd .."を実行しているのですから /home/prg/ /home/ とならないのはなぜでしょうか? どうしても、わかりません。どうかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
system関数は「子シェル」を呼び出して(起動して)処理を行います。 処理が終ると、起動された子シェルはアンロードされ、起動時に設定されたカレントディレクトリ、環境変数、メモリも一緒に消えて無くなります。 子シェルが起動される時のカレントディレクトリは毎回同じ(親プロセスのカレントディレクトリを毎回引き継ぐ)ですから、system関数を呼ぶ度に、毎回同じディレクトリがカレントディレクトリになります。 何故なら、system関数を発行した親プロセス、呼ばれた子シェルは、それぞれ「自分のカレントディレクトリ」を持っているので、子シェルの中で cd .. を実行しても、親プロセスのカレントディレクトリは影響を受けません。 その為、一回目のsystem("pwd");と二回目のsystem("pwd");では、同じ結果になります。
その他の回答 (2)
- HOGERA3
- ベストアンサー率35% (50/139)
>#pwd >#cd .. >#pwd >をプログラムでやるにはどうしたよいのでしょうか? 以下のように、セミコロンで区切るとできます。 system("pwd ; cd .. ; pwd");
- HOGERA3
- ベストアンサー率35% (50/139)
system()は実行するたびに別プロセスをforkするからです。 すごく大雑把に言うと、 system("cd .."); system("pwd"); は、一度term(xtermとか)を開いてcd .. を実行して、 また別のtermを開いてpwdを実行する ようなかんじです。
お礼
イメージがよくわきました。ありがとうございます。 一つ疑問があるのですが、 #pwd #cd .. #pwd をプログラムでやるにはどうしたよいのでしょうか?
お礼
詳しい説明ありがとうございます。 毎回実行した結果が消されてるとは思いませんでした。 では、popenを使えば pwd cd .. pwd としたときに結果が反映されますか?