• ベストアンサー

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/ とならないのはなぜでしょうか? どうしても、わかりません。どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

system関数は「子シェル」を呼び出して(起動して)処理を行います。 処理が終ると、起動された子シェルはアンロードされ、起動時に設定されたカレントディレクトリ、環境変数、メモリも一緒に消えて無くなります。 子シェルが起動される時のカレントディレクトリは毎回同じ(親プロセスのカレントディレクトリを毎回引き継ぐ)ですから、system関数を呼ぶ度に、毎回同じディレクトリがカレントディレクトリになります。 何故なら、system関数を発行した親プロセス、呼ばれた子シェルは、それぞれ「自分のカレントディレクトリ」を持っているので、子シェルの中で cd .. を実行しても、親プロセスのカレントディレクトリは影響を受けません。 その為、一回目のsystem("pwd");と二回目のsystem("pwd");では、同じ結果になります。

goma200
質問者

お礼

詳しい説明ありがとうございます。 毎回実行した結果が消されてるとは思いませんでした。 では、popenを使えば pwd cd .. pwd としたときに結果が反映されますか?

その他の回答 (2)

  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.3

>#pwd >#cd .. >#pwd >をプログラムでやるにはどうしたよいのでしょうか? 以下のように、セミコロンで区切るとできます。 system("pwd ; cd .. ; pwd");

  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.1

system()は実行するたびに別プロセスをforkするからです。 すごく大雑把に言うと、 system("cd .."); system("pwd"); は、一度term(xtermとか)を開いてcd .. を実行して、 また別のtermを開いてpwdを実行する ようなかんじです。

goma200
質問者

お礼

イメージがよくわきました。ありがとうございます。 一つ疑問があるのですが、 #pwd #cd .. #pwd をプログラムでやるにはどうしたよいのでしょうか?

関連するQ&A