アプリ版:「スタンプのみでお礼する」機能のリリースについて

cygwinでC言語を勉強しています。
そして昨日system関数の存在を知ったのでこんなプログラムを書いて見ました。
#include <stdio.h>
#include <stdlib.h>
main()
{
system("pwd");
system("cd ..");
system("pwd");
}
すると、結果は
/home/prg/
/home/prg/
となりました。"cd .."を実行しているのですから
/home/prg/
/home/
とならないのはなぜでしょうか?
どうしても、わかりません。どうかよろしくお願いします。

A 回答 (3件)

system関数は「子シェル」を呼び出して(起動して)処理を行います。



処理が終ると、起動された子シェルはアンロードされ、起動時に設定されたカレントディレクトリ、環境変数、メモリも一緒に消えて無くなります。

子シェルが起動される時のカレントディレクトリは毎回同じ(親プロセスのカレントディレクトリを毎回引き継ぐ)ですから、system関数を呼ぶ度に、毎回同じディレクトリがカレントディレクトリになります。

何故なら、system関数を発行した親プロセス、呼ばれた子シェルは、それぞれ「自分のカレントディレクトリ」を持っているので、子シェルの中で cd .. を実行しても、親プロセスのカレントディレクトリは影響を受けません。

その為、一回目のsystem("pwd");と二回目のsystem("pwd");では、同じ結果になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/02/06 17:00

>#pwd


>#cd ..
>#pwd
>をプログラムでやるにはどうしたよいのでしょうか?

以下のように、セミコロンで区切るとできます。

system("pwd ; cd .. ; pwd");
    • good
    • 0

system()は実行するたびに別プロセスをforkするからです。



すごく大雑把に言うと、
system("cd ..");
system("pwd");
は、一度term(xtermとか)を開いてcd .. を実行して、
また別のtermを開いてpwdを実行する
ようなかんじです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/02/06 16:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!