当前位置: 技术问答>linux和unix
关于文件锁的问题
来源: 互联网 发布时间:2016-05-03
本文导语: 判断文件是否有其他进程在读,如果在读则等待。如果没有其他进程读,加锁禁止其他进程读,写入数据,去锁。 如何判断文件被其他进程在读取?写入数据时对文件加锁防止其他进程读取? | ...
判断文件是否有其他进程在读,如果在读则等待。如果没有其他进程读,加锁禁止其他进程读,写入数据,去锁。
如何判断文件被其他进程在读取?写入数据时对文件加锁防止其他进程读取?
如何判断文件被其他进程在读取?写入数据时对文件加锁防止其他进程读取?
|
先给给你一个信号灯的例子,多进程写一个文件。
#include
#include
#include
#define PERMS IPC_CREAT|IPC_EXCL|00666
#define MAX_CANON 10
void init_semaphore_struct(struct sembuf *sem,int semnum, int semop,int semflg)
{
/* 初始话信号灯结构 */
sem->sem_num=semnum;
sem->sem_op=semop;
sem->sem_flg=semflg;
}
int del_semaphore(int semid)
{
/* 信号灯并不随程序的结束而被删除,如果我们没删除的话(将1改为0)
可以用ipcs命令查看到信号灯,用ipcrm可以删除信号灯的
*/
#if 1
return semctl(semid,0,IPC_RMID);
#endif
}
int main(int argc,char **argv)
{
char buffer[MAX_CANON],*c;
char buffer2[MAX_CANON];
int i,n;
int semid,semop_ret,status;
pid_t childpid;
struct sembuf semwait,semsignal;
FILE * ar_Fp;
/* 使用IPC_PRIVATE 表示由系统选择一个关键字来创建 */
/* 创建以后信号灯的初始值为0 */
if((semid=semget(IPC_PRIVATE,1,PERMS))==-1)
{
fprintf(stderr,"[%d]:Acess Semaphore Error:%sna",getpid(),(char *)strerror(errno));
exit(1);
}
/* semwait是要求资源的操作(-1) */
init_semaphore_struct(&semwait,0,-1,0);
/* semsignal是释放资源的操作(+1) */
init_semaphore_struct(&semsignal,0,1,0);
/* 开始的时候有一个系统资源,如果不执行会进入无限等待状态 */
if(semop(semid,&semsignal,1)==-1)
{
fprintf(stderr,"[%d]:Increment Semaphore Error:%sna",
getpid(),(char *)strerror(errno));
if(del_semaphore(semid)==-1){
fprintf(stderr,"[%d]:Destroy Semaphore Error:%sna",
getpid(),(char *)strerror(errno));
}
exit(1);
}
/* 创建一个进程链(4个进程) */
for(i=0;i [Process=11823]-->[Parent=11822]-->[Child=0]
===Child [i=1]-->[Process=11824]-->[Parent=11821]-->[Child=0]
===Para [i=1]-->[Process=11822]-->[Parent=11821]-->[Child=11823]
===Para [i=1]-->[Process=11821]-->[Parent=7646]-->[Child=11824]
#include
#include
#include
#define PERMS IPC_CREAT|IPC_EXCL|00666
#define MAX_CANON 10
void init_semaphore_struct(struct sembuf *sem,int semnum, int semop,int semflg)
{
/* 初始话信号灯结构 */
sem->sem_num=semnum;
sem->sem_op=semop;
sem->sem_flg=semflg;
}
int del_semaphore(int semid)
{
/* 信号灯并不随程序的结束而被删除,如果我们没删除的话(将1改为0)
可以用ipcs命令查看到信号灯,用ipcrm可以删除信号灯的
*/
#if 1
return semctl(semid,0,IPC_RMID);
#endif
}
int main(int argc,char **argv)
{
char buffer[MAX_CANON],*c;
char buffer2[MAX_CANON];
int i,n;
int semid,semop_ret,status;
pid_t childpid;
struct sembuf semwait,semsignal;
FILE * ar_Fp;
/* 使用IPC_PRIVATE 表示由系统选择一个关键字来创建 */
/* 创建以后信号灯的初始值为0 */
if((semid=semget(IPC_PRIVATE,1,PERMS))==-1)
{
fprintf(stderr,"[%d]:Acess Semaphore Error:%sna",getpid(),(char *)strerror(errno));
exit(1);
}
/* semwait是要求资源的操作(-1) */
init_semaphore_struct(&semwait,0,-1,0);
/* semsignal是释放资源的操作(+1) */
init_semaphore_struct(&semsignal,0,1,0);
/* 开始的时候有一个系统资源,如果不执行会进入无限等待状态 */
if(semop(semid,&semsignal,1)==-1)
{
fprintf(stderr,"[%d]:Increment Semaphore Error:%sna",
getpid(),(char *)strerror(errno));
if(del_semaphore(semid)==-1){
fprintf(stderr,"[%d]:Destroy Semaphore Error:%sna",
getpid(),(char *)strerror(errno));
}
exit(1);
}
/* 创建一个进程链(4个进程) */
for(i=0;i [Process=11823]-->[Parent=11822]-->[Child=0]
===Child [i=1]-->[Process=11824]-->[Parent=11821]-->[Child=0]
===Para [i=1]-->[Process=11822]-->[Parent=11821]-->[Child=11823]
===Para [i=1]-->[Process=11821]-->[Parent=7646]-->[Child=11824]
|
文件锁,
参看 fcntl等相关函数的使用
参看 fcntl等相关函数的使用
|
实现互斥机制的最简单办法就是使用信号灯.
http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
希望对你有帮助
http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
希望对你有帮助
|
当设置了写锁后,该文段就只属于你的,其他进程不能设置写锁或者读锁。
我也不知道如何判断有其他进程在读取该文件。期望有人指点下
我也不知道如何判断有其他进程在读取该文件。期望有人指点下
|
用NONBLOCK模式加锁,fcntl就是没有W的那个加锁选项,如果返回EBUSY EAGAIN之类的错误那么说明文件已经被加锁,否则加锁成功,
|
默认的是建议性锁,加强制性锁就可以满足你的要求了。