过年送分,外加一个文件读写问题????????

bekars 2005-02-06 04:17:23
如何在Linux中得知一个文件是否被打开了,编程如何保证一个文件只被一个程序打开,就是非共享打开文件,过年送分了!
...全文
120 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
limlzm 2005-02-08
  • 打赏
  • 举报
回复
新年快乐
nodummy 2005-02-08
  • 打赏
  • 举报
回复
不要用flock,上次用了一下,好像有副作用……

一般都用fcntl来做这个东西的……
sharkhuang 2005-02-07
  • 打赏
  • 举报
回复
应该就这个方法吧!还有其他的?
winter_sui 2005-02-07
  • 打赏
  • 举报
回复
用文件所比较好。
fopen函数虽然功能是打开一个文件,但其实他什么也没做,只是为进程找到文件,然后把文件的一些必要信息存在内核里。他根本不能不能锁定文件,如果再来个进程打开他也是没有问题的,而且读写都互不影响。
解决的方法就是用flock来锁定文件。简单的例子如下:

fp=open("filename","w"); //不要用fopen打开,flock需要的是用open低级打开的文件
flock(fp,LOCK_EX); //LOCK_SH, LOCK_EX, 两种锁的方式
...这时肯定是你自己打开了,作相应的处理吧。
flock(fp,LOCK_UN); //记得用完后要开锁。
honlyn 2005-02-07
  • 打赏
  • 举报
回复
9653013 2005-02-07
  • 打赏
  • 举报
回复
int test_lock( int fd )
{
struct flock flockbuf;
flockbuf.l_type = F_WRLCK;
flockbuf.l_start = 0;
flockbuf.l_whence = SEEK_SET;
flockbuf.l_len = 0;
if( fcntl( fd, F_GETLK,&flockbuf ) <0 )
{
printf("can not lock %s %s\n",LOCK_FILE,strerror(errno));
exit(-1);
}
/*no lock */
if( flockbuf.l_type == F_UNLCK )
return 0;
return( flockbuf.l_pid );
}

void lock_file( int fd )
{
struct flock flockbuf;
flockbuf.l_type = F_WRLCK;
flockbuf.l_start = 0;
flockbuf.l_whence = SEEK_SET;
flockbuf.l_len = 0;
if( fcntl( fd, F_SETLK,&flockbuf ) <0 )
{
printf("can not lock %s %s\n",LOCK_FILE,strerror(errno));
exit(-1);
}
}

void judge_lock()
{
int fd;
struct stat statbuf;
if( lstat( LOCK_FILE,&statbuf ) <0 )
{
fd = open( LOCK_FILE,O_CREAT|O_TRUNC|O_RDWR,0600 );
if( fd < 0 )
{
printf("can not creat %s %s\n",LOCK_FILE,strerror(errno)
);
exit(-1);
}
lock_file( fd );
}
else
{
fd = open( LOCK_FILE,O_RDWR,0600 );
if( fd < 0 )
{
printf("can not creat %s %s\n",LOCK_FILE,strerror(errno)
);
exit(-1);
}
int ret = test_lock( fd );
/* tasker is not running*/
if( ret == 0 )
lock_file( fd );
else
{
printf("tasker is running\n");
exit(-1);

}
}
return;
}
tengulre 2005-02-06
  • 打赏
  • 举报
回复
我个人觉得写程序pid方法较佳
bekars 2005-02-06
  • 打赏
  • 举报
回复
用文件锁

如何用???
quil 2005-02-06
  • 打赏
  • 举报
回复
用文件锁
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧