ディレクトリに「実行」ビットが設定されていないと、そのディレクトリをプロセスの作業ディレクトリに設定できないことがわかりました。
しかし、なぜこれが起こるのか理解できません。プロセスの作業ディレクトリを設定するときに、プロセスメモリの文字列だけを変更すればよいという意味です。それでは、プロセスの作業ディレクトリ設定とディレクトリの「実行」ビットの間にはどのような関係がありますか? !
答え1
UNIXカーネルの観点から作業ディレクトリを変更するには、chdir()
システムコールを呼び出す必要があります。
このシステムコールは、カーネルで権限チェックを実行して、プロセスがそのパスに対する実行権限を持っているかどうかを確認します。これはUNIXの定義/仕様です。
権限がない場合、システムコールはエラーを返します。その場合、プロセスの現在の作業ディレクトリが変更されます。
状態は実際には単純な文字列ではなく、ディレクトリ inode へのポインタで表されます。これがプロセスが占めるディレクトリの名前を変更できる理由です。
注:実際にディレクトリを読み取らなくてもこれを行うことができます。読み取りを使用すると、ディレクトリのリストを読み取ることができます。ディレクトリ名がわかっている場合にのみ、cd
ディレクトリとして実行してファイルを開くことができます。
答え2
作業ディレクトリの変更は、プロセスメモリ内の文字列を変更するよりも少し複雑です。実際、文字列はカーネルに保持され、システムコールによって変更されます。したがって、作業ディレクトリが変更されると、カーネルはアクセス制御チェックを実行します。またx
、ディレクトリにビットが設定されていないと、作業ディレクトリが何であっても、そのディレクトリ内のすべてのファイルにアクセスできません。
「実行」ディレクトリの概念は実行可能プログラムの概念ほど実際には存在しないため、これをディレクトリの「実行」ビットと呼ぶことは少し誤解を招くことがあります。しかし、しばしば別の名前で呼ばれることもありますが、POSIX仕様「実行/検索」権限と呼びますが、「アクセス」権限と見たこともあります。 GNUのマニュアルページではこれを「検索」とも呼びます。chdir(2)
エラー情報:
EACCES
パスコンポーネントの1つに対する検索権限が拒否されました。
同様に、ディレクトリを「実行」したり、通常のファイルを「検索」したり「アクセス」したりすることもできないため、過去に同じビットが再利用されていることがわかります。