1

開いているデバイス記述子がありますが、デバイス名とopen(...)に渡されるオプションがわかりません。開くために渡されたのと同じオプションを使用して、新しいデバイス記述子を開きたい。

int newFd = copy(referenceFd);

コピーが仕事をするところ。newFdでさらにioctl()を実行すると、referenceFdも変更されるため、dup()は確かに間違った選択です。したがって、新しい記述子を開きたいと思います。

そのような機能を提供するシステムコールはありますか?
私はまだ何かを見つけることができませんでした。

4

2 に答える 2

3

fcntlあなたはおそらく一連の呼び出しでそれを行うことができます:

F_GETFD-ファイル記述子ファイルに関連付けられているで定義されているファイル記述子フラグを取得します。

F_GETFL-fildesに関連付けられたファイルの説明について、で定義されているファイルステータスフラグとファイルアクセスモードを取得します。

上記のSUSv4ページをリンクしました。Linuxバージョンにも興味があるかもしれません。

于 2012-08-27T15:18:18.623 に答える
1

fdまず、を使用してファイル記述子の記述子フラグを取得します

    int flags = fcntl(fd, F_GETFL);

次に、Linux 固有の/proc/self/fd/fdエントリを使用して記述子を再度開きます。

    int  newfd;
    char buffer[32];

    if (snprintf(buffer, sizeof buffer, "/proc/self/fd/%d", fd) < sizeof buffer) {
        do {
            newfd = open(buffer, flags & ~(O_TRUNC | O_EXCL), 0666);
        } while (newfd == -1 && errno == EINTR);
        if (newfd == -1) {
            /* Error: Cannot reopen file. Error in errno. */
        }
    } else {
        /* Error: the path does not fit in the buffer. */
    }

再オープンされたファイル記述子は、newfd.

O_TRUNC(ファイルを切り詰める) と(存在する場合は失敗する) がフラグに含まれていないことを確認したい可能性が最も高いことに注意してくださいO_EXCL。これは、正確な元のフラグを使用して再度開くと望ましくない結果が生じる場合を回避するためです。

名前の変更に関して競合状態が発生するため、を使用したくありませ。ユーザーは、上記のコードのと の間でターゲット ファイルの名前を変更します。上記はそれを完全に回避します。lstat()lstat()open()

Linux 固有になりたくない/dev/fd/fd場合は、上記が失敗した場合に同じことを試みるコードを追加します。一部の Unix システム (およびほとんどの Linux ディストリビューション) でサポートされています。

于 2012-08-27T16:31:11.820 に答える