2

Linux のファイルに関する本を読んだところ、次の例が示されています。

int main(char ** argv, int argc) {
  int stat;
  int fd = open("dugma1.txt", O_WRONLY, 0666);

  if (fork() == 0) {
    int fd2 = open("dugma1.txt", O_WRONLY, 0666);
    sleep(10);
    if (lockf(fd2, F_TLOCK, 17) >= 0) {
      write(fd2, "I was here second", 17);
    }
  } //if
  else {
    lockf(fd, F_TLOCK, 16);
    write(fd, "I was here first", 16);
    wait(&stat);    
  }
}

出力が次のようになると書かれています: I was here first、理由: ファイルを閉じません。しかし、私はこの説明を理解していませんでした。最初に : を書きますが、その後でコードのこの部分に行かないI was here first理由は次のとおりです。sleep(10)

if (lockf(fd2, F_TLOCK, 17) >= 0) {
   write(fd2, "I was here second", 17);
}

F_TLOCKはノンブロッキングであり、そのために「I was here second」と書くことに成功します。

ありがとう

4

2 に答える 2

0
lockf(fd2,F_TLOCK,17)

エラー (EAGAIN) が発生したため、-1 を返します。ファイルへの書き込みに必要な値は、-1 ではなく 0 以上です。テストは失敗し、書き込みは行われません。

于 2012-07-04T21:26:35.370 に答える
0

親は開かれたファイルに対して実行され、最初のバイトlockf(fd, F_TLOCK, 16)がロックされます。16次に、テキストを内部に書き込み、子が終了するのを待ちます。ファイルを閉じないため、ロックが残ります。close(fd);の後に親のコードにがあった場合write()、ロックは解除されますが、解除されません。

子は最初にしばらくスリープし、ファイルの最初の 17 バイトをロックしようとしますが、親がまだロックを保持しているため失敗します。lockf(fd2, F_TLOCK, 17)これが失敗する理由ですEAGAIN- 操作は後で繰り返す必要があります。-1エラーは、子コードの条件が実行されないようにする戻り値によって通知されます。

于 2012-07-04T21:44:54.930 に答える