複数のスレッドが同じファイル記述子を使って同時に入出力操作を行う場合、従来の UNIX の入出力インタフェースがスレッドに対して安全ではない場合があります。この問題は、lseek(2) システムコールがファイルオフセットを設定するとき、入出力が逐次的に行われない場合に発生します。ファイルオフセットは、次の read(2) または write(2) 呼び出しでファイル内の操作開始位置を指定するときに使用されます。このとき、同じファイル記述子に対して複数のスレッドが lseek() を実行してしまうと矛盾が生じます。
この問題を回避するには、システムコール pread() と pwrite() を使用します。
#include <sys/types.h> #include <unistd.h> ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset); ssize_t pwrite(int filedes, void *buf, size_t nbyte, off_t offset);
pread(2) と pwrite(2) は、read(2) や write(2) と同様に機能しますが、ファイルオフセットの引数が追加されている点が異なります。lseek(2) の代わりに、この引数でオフセットを指定すれば、複数のスレッドから同じファイル記述子に対して安全に入出力操作を実行できます。