C言語関係掲示板

過去ログ

No.331.マルチOSとシングルOSでのchdir

[戻る] [ホームページ]
No.2092

chdirについて
投稿者---みずや(2002/07/16 11:00:21)


はじめまして、みずやといいます。

UNIX環境でcdコマンドと同じ働きをするプログラムを作成しよう
としているのですが、どうもchdir関数が上手く働かないのでどなたか
原因のわかる方、どうか教えてください。

私が作成したプログラムは、こんな感じです(短くするためにエラー処理
は省いてます)

#------------------------------------------------------------------
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main( int argc , char *argv[] )
{
  /*引数がなければホームディレクトリに移動*/
  if( argc == 1 )
    chdir( getenv( "HOME" ) ) ;
  else
    /*第1引数のディレクトリに移動*/
    chdir( argv[1] ) ;

  return 0 ;

}
#----------------------------------------------------------------


自分ではこれで問題ないように思って実行したのですが、プログラムが
終了した時点でまったくカレントディレクトリが移動されていませんで
した。
ちなみにプログラム開始直後と終了直前にgetcwdでカレントディレク
トリを取得して表示させてみたのですが、その出力では正しくカレント
ディレクトリは移動していました。
なのに、プログラムが終了するとそのままなんです。

いったいなにがいけないのでしょうか?

No.2095

Re:chdirについて
投稿者---ともじ(2002/07/16 18:00:58)


こんにちは。

>UNIX環境でcdコマンドと同じ働きをするプログラムを作成しよう
>としているのですが、どうもchdir関数が上手く働かないのでどなたか
>原因のわかる方、どうか教えてください。

>自分ではこれで問題ないように思って実行したのですが、プログラムが
>終了した時点でまったくカレントディレクトリが移動されていませんで
>した。
>ちなみにプログラム開始直後と終了直前にgetcwdでカレントディレク
>トリを取得して表示させてみたのですが、その出力では正しくカレント
>ディレクトリは移動していました。
>なのに、プログラムが終了するとそのままなんです。

生憎UNIXの環境が無いのでMS-DOS上で動作確認だけでも、と思いましたら
意外な結果が得られました。
私が試してみたのは、XP上で、
LSIC-86試食版:chdir成功
Turbo-C++:chdir成功
BCC:chdirするも、カレント変わらず
というものでした。

ソースは3つともヘッダ以外は同じものです。
3コンパイラともchdirの戻り値は正しく、getcwdでカレントも
確かめましたが、カレントディレクトリは移動していましたが、
BCCのみ、実行後のカレントディレクトリは変更していませんでした。
他の2つは実行後のカレントディレクトリも変更しました。
また、BCCでのプログラム中でchdir実行後に system("dir"); をすると
chdirしたディレクトリの中身を表示しました。

しばらくNet上で調べてみたのですが、こちらもわからず仕舞いです。
ひょっとしたら、これが仕様なのかもしれません。


No.2097

Re:chdirについて
投稿者---かずま(2002/07/16 19:15:39)


> 生憎UNIXの環境が無いのでMS-DOS上で動作確認だけでも、と思いましたら
> 意外な結果が得られました。

Unix や Windows は、マルチタスクの OS で、プログラムはそれぞれ別のプロセ
スとして起動されます。プロセスは、メモリー空間や環境変数やカレントディレ
クトリなどをそれぞれ別々に持っています。各プロセスが自分のカレントディレ
クトリを変更しても、他のプロセスのカレントディレクトリを変更することは
できません。

MS-DOS は、シングルタスクの OS ですから、MS-DOS 全体でカレントディレクト
リはひとつです。あるプログラムがそれを変更したら、それは他のプログラムに
も引き継がれます。

Visual C++ や Borland C++ の chdir は、Win32 API の SetCurrentDirectory
で実装されているでしょうから、Unix の sytem call である chdir と同じよう
に各プロセスごとのカレントディレクトリの変更になります。

LSI C-86 や Turbo C++ の chdir は、MS-DOS の INT 21H の AH=3Bh を使って
実装されているでしょうから、MS-DOS 環境全体のカレントディレクトリを変更し
てしまうものと思われます。

No.2098

Re:chdirについて
投稿者---ともじ(2002/07/16 20:10:06)


>Unix や Windows は、マルチタスクの OS で、プログラムはそれぞれ別のプロセ
>スとして起動されます。プロセスは、メモリー空間や環境変数やカレントディレ
>クトリなどをそれぞれ別々に持っています。各プロセスが自分のカレントディレ
>クトリを変更しても、他のプロセスのカレントディレクトリを変更することは
>できません。

マルチOSかシングルOSかの違いだったのですか。勉強になります。

つまり、UNIXでもプログラム実行後のカレントディレクトリは
変えられないということですね。

No.2143

ありがとうございます
投稿者---みずや(2002/07/22 10:03:49)


ともじさん、かずまさん、どうもありがとうございます。

なるほど、別のプロセスで変更しているから元のプロセスでは変更されないのですね。
ということは、単独のプログラムとして走らせてUNIX上でcdコマンドと同等の効果を持つものはつくれない、ということですね。

ちょっと最初に説明が足りなかったのですが、簡単なシェルを作ってその中でcdコマンドの効果を持たせたかったので、シェルと同じプロセスの中でやればうまくいきそうです。

本当に、どうもありがとうございました。