21

私は現在、ファイルシステムを書いています。(statvfsさらにはstatfs) 構造体には、そのパス内の名前の最大長を指定するフィールドが含まれています。マンページ ( ) でPATH_MAX定義されているように、これはディレクトリごとに定義されていることを意味します (したがって、基礎となるファイルシステムによって決定されます)。この値をどのように指定しますか?pathconfgetconf

4

6 に答える 6

3

PATH_MAXほとんどの場合、ファイルシステムの関数呼び出しインターフェイスのプロパティとして動作するため、ディレクトリ間で異なるようにすることはあまり意味がないと思います。

たとえば、大きなディレクトリツリーを含むディレクトリの名前を変更したり移動したりすると、最長の絶対パス名が長くなる可能性があり、それを制限するのは複雑で非効率的です。

代わりにPATH_MAX、カーネルが渡されたパス名を一時的な非ページメモリにコピーできるようにします。このメモリは、アクセスごとにページフォールトを許可する必要なしに処理できます。このようなメモリを大量に割り当てると、カーネルが実行している他のほとんどの処理がブロックされたり、カーネルパニックが発生したりする可能性があります。

于 2010-09-10T22:27:23.920 に答える
2

POSIX では_PC_PATH_MAX、現在のディレクトリに基づいて変更することが許可されていますが、変更しないシステムが準拠していないという意味ではありません。

存在する本当の理由PATH_MAXは、実際の作業を行う前に、カーネルがパス名をカーネル空間にコピーすることです。

PATH_MAX関連するフィールドがあるというあなたの主張statvfsは間違っています。それは に関連してNAME_MAXいますが、これは別のことです。

于 2013-06-07T00:11:53.943 に答える
0

他の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 */
}
于 2011-10-11T23:40:53.380 に答える
-1

PATH_MAXはシステム全体の設定であり、通常、pathmax.hで次のように定義されます。

define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
            : pathconf ("/", _PC_PATH_MAX))
于 2010-07-24T17:49:24.743 に答える