最近、私が書いているライブラリのためにタイムステップを修正しています。いくつかの調査の結果、ライブラリの一般的なイベントシステムと正確かつ簡単に組み合わせることができる、このプロトタイプが完成したとします。
#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
エラーをして動作しないでしょう。しかし、その後、EFAULT
sを与えたにもかかわらず、以下が実際にその仕事をしたことがわかりました。
read(fds[0].fd, NULL, 8);
このようにファイル記述子をオフセットすることは合法で定義された動作ですか?そうでない場合(EFAULT
私に提案されているように、その天才の使用を控えるのに十分強力です)、読み取ったデータを書き留めずに破棄する関数、またはタイマーのファイル記述子をオフセットする関数はありますか?
read(2)のPOSIX仕様では、バッファー引数としてnullポインターを渡した場合の結果は指定されていません。特定のエラーコードは示されていません。また、記述子からデータが読み取られるかどうかも示されていません。
Linuxのmanページにはかかわらず、このエラーがあります:
EFAULT
bufはアクセス可能なアドレス空間の外にあります。
ただし、これが発生したときに8バイトを読み取って破棄するとは言っていません。
ですから、あなたが望むようにこれが機能することに頼ることはできないと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加