- 论坛徽章:
- 11
|
另外你上面使用的锁,为什么仍然不能保证每次写都成功写到文件末尾,而不会覆盖其它进程写入文件的数据?
...
雨过白鹭洲 发表于 2011-08-21 11:30 ![]()
修改了一点代码, 发现就可以了:
struct stat stat;
32
33 for(i=0;i<1000;i++)
34 {
35 if(fcntl(fd,F_SETLKW,&stF)==-1)
36 {
37 fprintf(stderr, "lock:");
38 }
39
41
42 lseek(fd,0,SEEK_END);
43 if(write(fd,"1",1)!=1)
44 {
45 fprintf(stderr, "write:");
46 }
47
48 fstat(fd, &stat);
49 printf("%d\n", stat.st_size);
50
52
53 stF.l_type=F_UNLCK;
54 if(fcntl(fd,F_SETLKW,&stF)==-1)
55 {
56 fprintf(stderr, "unlock:");
57 }
似乎暗示着确实是内核缓冲的问题; 但我然后又看了情景分析中的write/lseek的代码, 又说不通:
lseek 操作是将本进程文件表中的pos设置为 inode->isize; 而write 虽然是将数据写入了缓冲, 但在返回前却更新了inode->isize; 因此不应该出现这种现象。。。。。。。。。。。。。。。。。。 |
|