- 748 名前:login:Penguin mailto:sage [2008/04/18(金) 04:34:40 ID:fBS7BtR5]
- ログ出力の際にファイルロックが必要かどうか実験していたのですが、
ちょっと不思議な現象に出くわしました。 以下のプログラムを100プロセス同時に実行すると、hoge.logの一部で「wwritten」と なってしまう箇所があります。 fprintfでなくwrite(2)を使うと再現しないのでglibc(2.6.1)のせいだと思うのですが、 これはどういう原理なのでしょうか? #include <sys/file.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { int i; FILE* fp = NULL; int fd; int pid = getpid(); fp = fopen("hoge.log", "a"); if (!fp) { exit(1); } fd = fileno(fp); for (i=0; i<10000; i++) { flock(fd, LOCK_EX); fprintf(fp, "written by pid %d\n", pid); flock(fd, LOCK_UN); usleep(1000); } fclose(fp); return 0; }
|

|