作者changyy (可苦可乐)
站内Programming
标题Re: [问题] 关於 Lock a file 的现象之请教
时间Sun Apr 20 18:58:23 2008
下午经友人提供讯息, 有一个 function 叫 setbuf, 可供测试
经过测试後, 发现真的是 buf 的影响, 将 buf 设成 NULL 就结果正常啦 XD
不晓得这算不算是验证我上一篇的猜测 :P
顺便把 code 贴上来 或许哪天会帮到别人吧 XD
Usage> ./a.out 次数 是否setbuf为NULL
ex: # ./a.out 100000 Y; 代表要跑 十万 次且把 fd 的 buffer 设成 NULL
可以同时跑 3 支试试, 结果会存在 sum 这个档案, 记得要先生一下
结果应该是 30 万才对
# ./a.out 100000 N; 代表要跑 十万 次但不把 fd 的 buffer 设成 NULL
可以同时跑 3 支试试, 结果应该不是 30 万 XD
心得:
这东西的正常与否应该是跟 OS 的预设环境有关啦 :P
不过我也正在思考 setbuf( fd, NULL ) 对效能的影响了
==
以下程式, 看不懂得勿用, 不负责任何执行结果, 仅供参考
( shell 有砍档的动作啦 )
==
简单的 shell script :
==
#!/bin/sh
rm -rf sum; echo "0" > sum; # 砍掉 sum 这个档案, 并建其内容为 0
gcc lock_test.c ;
./a.out 100000 Y &
./a.out 100000 Y &
./a.out 100000 Y &
==
lock_test.c
==
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
void LockFileByPtr( FILE * fd )
{
if( flock( fileno( fd ) , LOCK_EX ) != 0 )
{
perror(" Error @ LockFilePtr ");
exit(1);
}
}
void UnlockFileByPtr( FILE * fd ) // 印象中直接 fclose 也行?!要查查
{
if( flock( fileno( fd ) , LOCK_UN ) != 0 )
{
perror(" Error @ UnlockFileByPtr ");
exit(1);
}
fclose( fd );
}
int main( int argc , char* argv[] ) {
FILE *fd ;
char buf[100] , set_buf_null;
unsigned int x , i , count;
if( argc != 3 ) return;
count = atoi(argv[1]);
set_buf_null = argv[2][0];
i = 0;
while( i < count ){
fd = fopen( "sum" , "r+" );
if( set_buf_null == 'Y')
setbuf( fd , NULL );
LockFileByPtr( fd );
// 接着对 "target" file 做更新
fgets( buf , 100 , fd );
x = atoi( buf ); x++;
rewind(fd); fprintf( fd , "%u\n",x);
// 更新完 unlock
UnlockFileByPtr( fd );
i++;
}
return 0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.217.56
1F:推 legnaleurc:不知道fsync来不来得及在有buffer的140.123.224.125 04/20 19:03
2F:→ legnaleurc:状况下同步?140.123.224.125 04/20 19:04