openとO_SYNC

Back


openシステムコールには通常よく使う「O_RDONLY,O_WRONY,O_RDWR,O_CREATE,O_APPEND」などのフラグ他に、同期モード「O_SYNC」や非停止モード「O_NONBLOCK」というI/Oの同期に関するフラグも用意されている。

System callsによると
O_NONBLOCK または O_NDELAY
       ファ イルは非停止(non-blocking)モードでオープンされ
       る。 open や他の、そのファイル・ディスクリプター に
       対 するすべての操作も呼び出したプロセスを待たせるこ
       となく返される。 FIFO (ネームド・パイプ)を扱う場 合
       には fifo(4) も参照すること。

O_SYNC ファ イルは同期(synchronous) I/O モードでオープンさ
       れる。そのファイル・ディスクリプターに対する全て の
       write  は、対応するハードウェアに物理的に書き込まれ
       るまで呼び出したプロセスに戻らない。 以下の「制限」
       を見よ。
と書いてある。
例えば以下のようなループでfdに5MB書き込むプログラムの時、
for(i=0;i<2;i++){
  write(fd,buf,0x500000);
  printf("5MB.\n");
}
open時に「O_SYNC」フラグを立ておくと、完全に5MB書き込むまで動作がブロックされるので、printfの"5MB."がなかなか表示されない。
逆に「O_NONBLOCK」かとくにフラグを立てない場合は、すぐに2回"5MB."を表示し、プログラムは終了する。
確実に書き込むまでプロセスをブロックしたい場合には、この「O_SYNC」が有効である。
しかし、「O_SYNC」フラグを立ててなくても書き込みに対してデバイスが追いつかなくなると適当にブロックしてくれるので、通常は使う必要ないでしょう。
June 23, 2001
Hidetada Baba <baba@daq.rikkyo.ac.jp>