在LINUX下如何判断一个文件是否已被其他进程打开?

wanglin1983125 2005-09-16 12:05:16
进程A和进程B

进程A已打开一个文件,然后进行文件操作。(进程A不是我自己做的进程,是另一个程序。)

我自己要写一个程序,形成进程B,他要确定这个文件是否已经被打开,并据此进行其他操作。
...全文
3860 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cashtang 2005-09-16
  • 打赏
  • 举报
回复
你可以先尝试用独占的方式打开,如果不行就说明文件已经被打开了。
Dylan_zz 2005-09-16
  • 打赏
  • 举报
回复
如果都是以append方式打开进行操作的话不会有什么问题。如果不是就需要同步了。
码农天天向上 2005-09-16
  • 打赏
  • 举报
回复
用下面这个上记录锁也可以

#include <sys/types.h>
#include <unistd.h>
#include <fcnt1.h>
int fcnt1(int f i l e d e s,int c m d,.../* struct flock * f l o c k p t r * / ) ;
返回:若成功则依赖于c m d(见下),若出错则为- 1

对于记录锁, c m d是F _ G E T L K、F _ S E T L K或F _ S E T L K W。第三个参数(称其为f l o c k p t r)
是一个指向f l o c k结构的指针。

所希望的锁类型:F _ R D L C K(共享读锁)、F _ W R L C K(独占性写锁)或F _ U N L C K(解
锁一个区域)
为了锁整个文件,通常的方法是将l _ s t a r t说明为0,l _ w h e n c e说明为S E E K _ S E T,l _ l e n说明为0。

用F _ G E T L K测试能否建立一把锁,然后用F _ S E T L K和F _ S E T L K W企图建立一
把锁,这两者不是一个原子操作。在这两个操作之间可能会有另一个进程插入并建立一把相关
的锁,使原来测试到的情况发生变化,如果不希望在建立锁时可能产生的长期阻塞,则应使用
F _ S E T L K,并对返回结果进行测试,以判别是否成功地建立了所要求的锁。

程序12-3 测试一个锁条件的函数
#include <sys/types.h>
#include <fcntl.h>
#include "ourhdr.h"

pid_t
lock_test(int fd, int type, off_t offset, int whence, off_t len)
{
struct flock lock;

lock.l_type = type;
lock.l_start = offset;
lock.l_whence = whence;
lock.l_len = len;

if(fcntl(fd, F_GETLK, &lock) < 0)
perror("fcntl error!");
if(lock.l_type == F_UNLCK)
return 0;
return (lock.l_pid);
}
如果存在一把锁,它阻塞由参数说明的锁,则此函数返回持有这把现存锁的进程的I D,否
则此函数返回0。通常用下面两个宏来调用此函数(它们也定义在o u r h d r. h)。
#define is_readlock(fd,offset,whence,len) \
l o c k _ t e s t ( f d , F _ R D L C K , o f f s e t , w h e n c e , l e n )
#define is_writelock(fd,offset,whence,len) \
l o c k _ t e s t ( f d , F _ W R L C K , o f f s e t , w h e n c e , l e n )
bugebear3 2005-09-16
  • 打赏
  • 举报
回复
lockf
cashtang 2005-09-16
  • 打赏
  • 举报
回复
用lockf可能要好一点,你用man lockf看看,在Linux与Solaris上都可以用的
cashtang 2005-09-16
  • 打赏
  • 举报
回复
man flock 函数
例子:
FILE * fp;
fp = fopen("test.txt","r+");
if( flock(fileno(fp),LOCK_EX) != -1 )
{
// 成功加独占锁!
}
上面没有加冗错机制,你自己做了,顺便说一下如果你 fclose(fp); 之后锁就会自动释放
wanglin1983125 2005-09-16
  • 打赏
  • 举报
回复
独占方式?能不能介绍一下打开的方法?

23,215

社区成员

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

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