読者です 読者をやめる 読者になる 読者になる

pwrite(2)を試してみた

linux

先週分の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に書かれている仕様通りの動き。