私は現在、ファイルシステムを書いています。(statvfs
さらにはstatfs
) 構造体には、そのパス内の名前の最大長を指定するフィールドが含まれています。マンページ ( ) でPATH_MAX
定義されているように、これはディレクトリごとに定義されていることを意味します (したがって、基礎となるファイルシステムによって決定されます)。この値をどのように指定しますか?pathconf
getconf
6 に答える
PATH_MAX
ほとんどの場合、ファイルシステムの関数呼び出しインターフェイスのプロパティとして動作するため、ディレクトリ間で異なるようにすることはあまり意味がないと思います。
たとえば、大きなディレクトリツリーを含むディレクトリの名前を変更したり移動したりすると、最長の絶対パス名が長くなる可能性があり、それを制限するのは複雑で非効率的です。
代わりにPATH_MAX
、カーネルが渡されたパス名を一時的な非ページメモリにコピーできるようにします。このメモリは、アクセスごとにページフォールトを許可する必要なしに処理できます。このようなメモリを大量に割り当てると、カーネルが実行している他のほとんどの処理がブロックされたり、カーネルパニックが発生したりする可能性があります。
POSIX では_PC_PATH_MAX
、現在のディレクトリに基づいて変更することが許可されていますが、変更しないシステムが準拠していないという意味ではありません。
存在する本当の理由PATH_MAX
は、実際の作業を行う前に、カーネルがパス名をカーネル空間にコピーすることです。
PATH_MAX
関連するフィールドがあるというあなたの主張statvfs
は間違っています。それは に関連してNAME_MAX
いますが、これは別のことです。
他のOSについては十分ではありませんが、これは少なくともFreeBSD 5.2.1のシステム全体の設定です
PATH_MAX は #62 にありますsys/syslimits.h
static int ufs_pathconf()
which は UFS FS の情報を返すためPATHCONF
、指定した方法でこの変数を使用します。
/*
* Return POSIX pathconf information applicable to ufs filesystems.
*/
int
ufs_pathconf(ap)
struct vop_pathconf_args /* {
struct vnode *a_vp;
int a_name;
int *a_retval;
} */ *ap;
{
switch (ap->a_name) {
.
.
.
.
case _PC_PATH_MAX:
*ap->a_retval = PATH_MAX;
return (0);
.
.
.
.
default:
return (EINVAL);
}
/* NOTREACHED */
}
PATH_MAXはシステム全体の設定であり、通常、pathmax.hで次のように定義されます。
define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
: pathconf ("/", _PC_PATH_MAX))