0

poll() がエラーを返したときに、コードでシナリオをテストしようとしています。しかし、poll() に強制的にエラーを返す方法がわかりません。poll() を無期限にブロックして SIGINT を送信しようとしましたが、プロセスが停止するだけです。

poll() を取得してエラーを返す方法はありますか?

ありがとう。

4

1 に答える 1

0

poll() を取得してエラーを返す方法はありますか?

おそらくいくつかのエラーがありますが、いくつかの潜在的なエラーが存在します。poll()以下は、具体的ではなく一般的なアプローチです。


場合によっては、テスト コードで代替コードを使用して偽のエラーを挿入する必要があります。

この一般的なアプローチの正しさは、コードとテストの目標に大きく依存しています。

int poll_result = poll(&fds, nfds, timeout);
#if TEST1
  if (poll_result != -1) {
    // Avoid using rand()
    static unsigned seed = 0;
    seed = (16807 * seed) mod 2147483647;  // https://stackoverflow.com/a/9492699/2410359

    if (seed % 97 == 0) { // about 1% of the time 
      // adjust as desired,  e.g. EINVAL may not make sense here.
      int faults[] = { EFAULT, EINTR, EINVAL, ENOMEM };
      const unsigned n = sizeof faults / sizeof faults[0];
      errno =  faults[seed % n];
      poll_result = -1;
    }
  }
#endif
...

poll()ref についての注記セクションを参照してくださいEAGAIN, EINTR

もちろん、代替コードを使用すると、真のコードでのみ発生する問題を隠すことができます。

于 2017-06-29T18:25:43.253 に答える