ファイル記述子をNULLに読み込むことは合法ですか?

S.Exchangeは有害と見なされます

最近、私が書いているライブラリのためにタイムステップ修正しています。いくつかの調査の結果、ライブラリの一般的なイベントシステムと正確かつ簡単に組み合わせることができる、このプロトタイプが完成したとします。

#include <stdio.h>
#include <unistd.h>
#include <sys/timerfd.h>
#include <poll.h>

struct pollfd fds[1];
struct itimerspec its;

int main(void) {
    fds[0] = (struct pollfd) {timerfd_create(CLOCK_MONOTONIC, 0), POLLIN, 0}; //long live clarity
    its.it_interval = (struct timespec) {0, 16666667};
    its.it_value = (struct timespec) {0, 16666667};
    timerfd_settime(fds[0].fd, 0, &its, NULL);
    while(1) {
        poll(fds, 1, -1);
        if(fds[0].revents == POLLIN) {
            long long buffer;
            read(fds[0].fd, &buffer, 8);
            printf("ROFL\n");
        } else {
            printf("BOOM\n");
            break;
        }
    }
    close(fds[0].fd);
    return 0;
}

しかし、タイマーのファイル記述子を再利用可能にするために、貴重な8バイトのデータ全体でCPUキャッシュを汚染しなければならなかったことは私をひどく傷つけました。そのため、次のようにread()呼び出しをに置き換えようとしましたlseek()

lseek(fds[0].fd, 0, SEEK_END);

残念ながら、両方のそれとさえlseek(fds[0].fd, 8, SEEK_CUR);私に与えたESPIPEエラーをして動作しないでしょう。しかし、その後、EFAULTsを与えたにもかかわらず、以下が実際にその仕事をしたことがわかりました

read(fds[0].fd, NULL, 8);

このようにファイル記述子をオフセットすることは合法で定義された動作ですか?そうでない場合(EFAULT私に提案されているように、その天才の使用を控えるのに十分強力です)、読み取ったデータを書き留めずに破棄する関数、またはタイマーのファイル記述子をオフセットする関数はありますか?

バーマー

read(2)のPOSIX仕様では、バッファー引数としてnullポインターを渡した場合の結果は指定されていません。特定のエラーコードは示されていません。また、記述子からデータが読み取られるかどうかも示されていません。

Linuxのmanページにはかかわらず、このエラーがあります:

EFAULT bufはアクセス可能なアドレス空間の外にあります。

ただし、これが発生したときに8バイトを読み取って破棄するとは言っていません。

ですから、あなたが望むようにこれが機能することに頼ることはできないと思います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Cで他のファイル記述子に書き込むことは可能ですか?

分類Dev

ファイル記述子3のbashリダイレクトは、tcpポートを読み取ってテキストファイルに書き込むための最も効率的な方法ですか?

分類Dev

ファイル記述子3のbashリダイレクトは、tcpポートを読み取ってテキストファイルに書き込むための最も効率的な方法ですか?

分類Dev

ソケットファイル記述子を子プロセスに渡すことはできますか?

分類Dev

「読み取り中」が「ファイル記述子」を開くことができるのに、なぜ「exec」が必要なのですか?

分類Dev

XMLファイルの読み込みのようなXDocumentの機能でDGMLファイルを読み込むことは可能ですか?

分類Dev

読み取り権限のみでファイルを書き込むことはできますか?

分類Dev

書き込み不可能なメモリに書き込むときのファイル、無名パイプ、またはソケットを表すファイル記述子に応じて、read()での動作が異なります

分類Dev

このファイルをマップC ++に読み込むにはどうすればよいですか?

分類Dev

ファイル記述子をbashし、whileループでprintfをファイルに書き込みます

分類Dev

Rustの特定のrawファイル記述子からどのように読み取ることができますか?

分類Dev

Cで「不正なファイル記述子」エラーが発生することなく、複数の子プロセスでファイル記述子のファイルポインタを使用するにはどうすればよいですか?

分類Dev

Bashで名前付きファイル記述子に書き込む方法は?

分類Dev

あるファイル記述子のtty設定を変更すると、別のファイル記述子に影響するのはなぜですか?

分類Dev

ファイル記述子を使用して書き込みをフラッシュするにはどうすればよいですか?

分類Dev

nodejsでファイル記述子カーソルを巻き戻すことは可能ですか?

分類Dev

Bash読み取り/書き込みファイル記述子-ファイルの先頭を探す

分類Dev

読み取りと書き込みに同じファイルを使用することは可能ですか?

分類Dev

子はforkの後に親で作成されたファイル記述子に書き込みます

分類Dev

nginxはどこでファイル記述子を開きますか?

分類Dev

Linuxでは、stdin、stdout、stderrはファイル記述子を開くことを意味しますか?

分類Dev

読み取り専用のフォルダにファイルを書き込むことができるのはなぜですか?

分類Dev

ファイルの読み取りと書き込みを同時に行うことはできますか?

分類Dev

Javaソースファイルを読み込むときに使用する文字セットは何ですか?

分類Dev

Viは、ファイルが読み取り専用であるにもかかわらず、ファイルに書き込むことができます

分類Dev

ファイル記述子からの読み取りに失敗する

分類Dev

錆びた状態でファイルを書き込むときに「不正なファイル記述子」エラーが発生するのはなぜですか?

分類Dev

ファイル記述子に書き込み、すぐに読み取ります

分類Dev

Google Cloud StorageからCSVファイルを使用してBigQueryを読み込むC#関数の記述に関する問題

Related 関連記事

  1. 1

    Cで他のファイル記述子に書き込むことは可能ですか?

  2. 2

    ファイル記述子3のbashリダイレクトは、tcpポートを読み取ってテキストファイルに書き込むための最も効率的な方法ですか?

  3. 3

    ファイル記述子3のbashリダイレクトは、tcpポートを読み取ってテキストファイルに書き込むための最も効率的な方法ですか?

  4. 4

    ソケットファイル記述子を子プロセスに渡すことはできますか?

  5. 5

    「読み取り中」が「ファイル記述子」を開くことができるのに、なぜ「exec」が必要なのですか?

  6. 6

    XMLファイルの読み込みのようなXDocumentの機能でDGMLファイルを読み込むことは可能ですか?

  7. 7

    読み取り権限のみでファイルを書き込むことはできますか?

  8. 8

    書き込み不可能なメモリに書き込むときのファイル、無名パイプ、またはソケットを表すファイル記述子に応じて、read()での動作が異なります

  9. 9

    このファイルをマップC ++に読み込むにはどうすればよいですか?

  10. 10

    ファイル記述子をbashし、whileループでprintfをファイルに書き込みます

  11. 11

    Rustの特定のrawファイル記述子からどのように読み取ることができますか?

  12. 12

    Cで「不正なファイル記述子」エラーが発生することなく、複数の子プロセスでファイル記述子のファイルポインタを使用するにはどうすればよいですか?

  13. 13

    Bashで名前付きファイル記述子に書き込む方法は?

  14. 14

    あるファイル記述子のtty設定を変更すると、別のファイル記述子に影響するのはなぜですか?

  15. 15

    ファイル記述子を使用して書き込みをフラッシュするにはどうすればよいですか?

  16. 16

    nodejsでファイル記述子カーソルを巻き戻すことは可能ですか?

  17. 17

    Bash読み取り/書き込みファイル記述子-ファイルの先頭を探す

  18. 18

    読み取りと書き込みに同じファイルを使用することは可能ですか?

  19. 19

    子はforkの後に親で作成されたファイル記述子に書き込みます

  20. 20

    nginxはどこでファイル記述子を開きますか?

  21. 21

    Linuxでは、stdin、stdout、stderrはファイル記述子を開くことを意味しますか?

  22. 22

    読み取り専用のフォルダにファイルを書き込むことができるのはなぜですか?

  23. 23

    ファイルの読み取りと書き込みを同時に行うことはできますか?

  24. 24

    Javaソースファイルを読み込むときに使用する文字セットは何ですか?

  25. 25

    Viは、ファイルが読み取り専用であるにもかかわらず、ファイルに書き込むことができます

  26. 26

    ファイル記述子からの読み取りに失敗する

  27. 27

    錆びた状態でファイルを書き込むときに「不正なファイル記述子」エラーが発生するのはなぜですか?

  28. 28

    ファイル記述子に書き込み、すぐに読み取ります

  29. 29

    Google Cloud StorageからCSVファイルを使用してBigQueryを読み込むC#関数の記述に関する問題

ホットタグ

アーカイブ