文件上锁问题
时间:2010-07-29
来源:互联网
# include <stdio.h>
# include <unistd.h>
# include <string.h>
# include <fcntl.h>
# include <errno.h>
static void
Lock(void)
{
int fd=0;
do{
fd=open("file.lck",O_WRONLY|O_CREAT|O_EXCL,0666);
if(fd==-1)
{
if(errno==EEXIST){
sleep(1);
}else{
fprintf(stderr,"%s:Creating lock file.lck\n",strerror(errno));
abort();
}
}
}while(fd==-1);
close(fd);
}
static void
UnLock(void)
{
unlink("file.lck"
;
}
int
main(int argc,char **argv)
{
FILE *f=NULL;
int i;
int ch;
int lck=0;
if(argc>2&&!strcasecmp(argv[1],"NOLOCK"
)
lck=0;
printf("
rocess ID %ld started with %s\n",(long)getpid(),lck?"locking":"no locking"
;
printf("breakpoint\n"
;
for(i=0;i<100;i++)
{
if(lck)
Lock();
f=fopen("1.txt","r+"
;
if(!f&&errno==ENOENT)
f=fopen("1.txt","w"
;
if(!f){
fprintf(stderr,"%s
pening file.dat file for r/w\n",strerror(errno));
if(lck)
UnLock();
return 1;
}
fseek(f,0,SEEK_END);
fprintf(f,"%05ld i=%06d",(long)getpid(),i);
for(ch=' ';ch<='z';++ch)
fputc(ch,f);
fputc('\n',f);
fclose(f);
if(lck)
UnLock();
}
printf("
rocess ID %ld completed.\n",(long)getpid());
return 0;
}
在这有个问题,为什么把Lock()方法去掉后,就会出问题呢?大虾们试一试!
小弟对这个Lock()函数起的作用不太清楚,望指教指教!
# include <unistd.h>
# include <string.h>
# include <fcntl.h>
# include <errno.h>
static void
Lock(void)
{
int fd=0;
do{
fd=open("file.lck",O_WRONLY|O_CREAT|O_EXCL,0666);
if(fd==-1)
{
if(errno==EEXIST){
sleep(1);
}else{
fprintf(stderr,"%s:Creating lock file.lck\n",strerror(errno));
abort();
}
}
}while(fd==-1);
close(fd);
}
static void
UnLock(void)
{
unlink("file.lck"

}
int
main(int argc,char **argv)
{
FILE *f=NULL;
int i;
int ch;
int lck=0;
if(argc>2&&!strcasecmp(argv[1],"NOLOCK"

lck=0;
printf("


printf("breakpoint\n"

for(i=0;i<100;i++)
{
if(lck)
Lock();
f=fopen("1.txt","r+"

if(!f&&errno==ENOENT)
f=fopen("1.txt","w"

if(!f){
fprintf(stderr,"%s

if(lck)
UnLock();
return 1;
}
fseek(f,0,SEEK_END);
fprintf(f,"%05ld i=%06d",(long)getpid(),i);
for(ch=' ';ch<='z';++ch)
fputc(ch,f);
fputc('\n',f);
fclose(f);
if(lck)
UnLock();
}
printf("

return 0;
}
在这有个问题,为什么把Lock()方法去掉后,就会出问题呢?大虾们试一试!
小弟对这个Lock()函数起的作用不太清楚,望指教指教!
作者: kellenforever 发布时间: 2010-07-29
Lock()是用来上创建锁文件的.如果锁文件已经存在,Lock()就循环检查知道锁文件不存在了,它就创建一个锁文件并返回.
一般线程同步时才需要锁文件吧.
一般线程同步时才需要锁文件吧.
作者: liwangli1983 发布时间: 2010-07-30
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28