先週分のLWNを見ててpwrite()というシステムコールを見つけたので、
どんな動作なのか試してみた。
manはこちらに。
manを読むと、指定したオフセット位置から指定されたバイト数分データを書き込むけど、ファイルのオフセットは変更しないと書かれているので、こんな感じのコードを書いてみた。
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <assert.h> int main(int argc, char **argv) { char c; int fd, ret; fd = open("test.txt", O_RDWR); assert(fd != -1); pread(fd, &c, sizeof(c), 5); printf("before pwrite():data is %c offset is %d\n", c, lseek(fd, 0, SEEK_CUR)); c = 'A'; ret = pwrite(fd, &c, sizeof(c), 5); assert(ret != -1); pread(fd, &c, sizeof(c), 5); printf("after pwrite():data is %c offset is %d\n", c, lseek(fd, 0, SEEK_CUR)); close(fd); return 0; }
実行結果はこれ
[masami@moonlight:~]% cat test.txt 0123456789 [masami@moonlight:~]% ./a.out before pwrite():data is 5 offset is 0 after pwrite():data is A offset is 0 [masami@moonlight:~]% cat test.txt 01234A6789 [masami@moonlight:~]%
データ読み書き後にlseek(2)しても返ってくるのは0なので、manに書かれている仕様通りの動き。