1

LinuxからFreeBSDに移植していて、:: mknod()がerrnoで失敗することに遭遇しました:

[EINVAL]           Creating anything else than a block or character spe-
                   cial file (or a whiteout) is not supported.

しかし、manページの前半に次のように記載されていることもわかります。

 The mknod() system call requires super-user privileges.

では、LinuxとFreeBSDの両方で機能する、使用するための適切な代替呼び出しは何でしょうか?

これが発生する私のコードスニペット:

mode_t mode
  = S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

if (::mknod(_resolvedName, mode, 0)) {

私の目的は、正しい権限で空のファイルを作成することです。

4

2 に答える 2

2

Linuxのマニュアルページによるとmknod(2)

POSIX.1-2001によると、「mknod()の移植可能な唯一の使用法は、FIFO専用ファイルを作成することです 。modeがS_IFIFOでない場合、またはdevが0でない場合、mknod()の動作は指定されていません。」

したがって、この方法での使用は移植性がなく、お勧めできません。

open(2)ただし、必要な機能を備えているようで、移植性のあるゼロサイズのファイルを作成します。タイプの3番目のパラメーターを受け入れ、これを使用mode_tして権限を設定できます。

于 2010-10-23T22:52:53.263 に答える
1

私の目的は、正しい権限で空のファイルを作成することです。

なぜだめですか:

std::fstream(_resolvedName); // Temporary object opens and closes in the
                             // same statement thus creating empty file.
于 2010-10-23T22:29:22.770 に答える