BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


[C] 怎么样子给文件上锁呢?[已解决]谢谢各位
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
  本主题由 net_robber 于 2008-6-18 11:23 限时高亮 
40943460
侠客



UID:588357
注册:2007-7-17
最后登录: 2008-09-09
帖子:47
精华:0

可用积分:35 (白手起家)
信誉积分:105
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2008-6-18 09:23 
我看程序中有lockf 命令.自己写了2个程序一个是lockf,一个是flock.可是都必须在同一个进程才起作用.大家看我写的对么?

#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/file.h>

int main()
{
  int fd,return_int;
  int num;
  char *buf= "jingjing";
  fd = open("bbb.txt",O_WRONLY); //bbb.txt中是一串字符串
  printf("%d\n",fd);
  //return_int = flock(fd,LOCK_EX);//加锁的语句
  //sleep(65);
  num = write(fd,buf,strlen(buf));
  //return_int = flock(fd,LOCK_UN);
  printf("%d\n",num);
  close(fd);
  return 0;

}//如果这样,字符串就写不进文件中.可是如果我在另一个程序中将文件加锁,在这个文件中向文件写数据还是能写进去!!
//write.c
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/file.h>

int main()
{
  int fd,return_int;
  int num;
  char *buf= "jingjing";
  fd = open("bbb.txt",O_WRONLY);
  num = write(fd,buf,strlen(buf));
  close(fd);
  return 0;
}

//flock.c
#include<sys/file.h>
#include<fcntl.h>

int main()
{
   int fd,return_int,return_inta;
   fd = open("bbb.txt",O_WRONLY);
   printf("fd is %d\n",fd);
   return_int = flock(fd,LOCK_EX|LOCK_NB);
   close(fd);
   printf("%d\n",return_int);
   return 0;
}//return_int 返回0


这样我就不太明白了.如果加锁只是在同一个进程才能生效??我的理解对么?????//lockf 例子基本同上
#include   <fcntl.h>
#include   <unistd.h>
#include   <errno.h>
#include   <stdio.h>
#include   <stdlib.h>

int   main(int   argc,   char   *argv)   {
                int   fildes;
                int   status;
                int   i=0;
                fildes = open("bbb.txt",O_RDWR);
                if   (fildes == -1)   {
                                fprintf(stderr,   "open   err=%d\n ",   errno);
                                return   -1;
                }
                status=lockf(fildes,F_TLOCK,(off_t)10000);
                if   (status !=0)   {
                                fprintf(stderr,   "err=%d\n ",   errno);
                }   else   {
                                fprintf(stderr,   "lock   ok\n ");
                }
                sleep(60);
                close(fildes);
}

[ 本帖最后由 40943460 于 2008-6-18 11:43 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-10-07
帖子:4234
精华:4

可用积分:7712 (富足长乐)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2
推广积分:0

状态:...在线...

[个人空间] [短信] [博客]


2楼 发表于 2008-6-18 09:37 
可以同时所以一个第三方文件,你不去读写它,只是用来判断锁的状态,用flock



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-10-07
帖子:4234
精华:4

可用积分:7712 (富足长乐)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2
推广积分:0

状态:...在线...

[个人空间] [短信] [博客]


3楼 发表于 2008-6-18 09:40 
个人建议,使用文件锁的时候,最好不要锁你同时还需要读写的那个文件a,容易出问题。
可以锁一个其他的文件b,每次需要读写文件a的时候,先获取b的文件所,然后在操作a即可。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
40943460
侠客



UID:588357
注册:2007-7-17
最后登录: 2008-09-09
帖子:47
精华:0

可用积分:35 (白手起家)
信誉积分:105
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2008-6-18 09:56 


QUOTE:
原帖由 Godbach 于 2008-6-18 09:40 发表
个人建议,使用文件锁的时候,最好不要锁你同时还需要读写的那个文件a,容易出问题。
可以锁一个其他的文件b,每次需要读写文件a的时候,先获取b的文件所,然后在操作a即可。

您的意思是 .比如 a b 两个文件, 要保护的文件是a ,那么对b加锁.如果判断b是锁着的,就不对a做操作,如果b没有锁,则可以对a进行操作是么?
flock 一共四种情况.LOCK_SH LOCK_EX,LOCK_UN,LOCK_NB  ,怎么来返回文件的状态是不是加锁了呢?
在上面的例子中,虽然我对文件加锁了,可是仍然能写进数据,这是为什么呢? 多谢.....



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
soul_of_moon   帅哥
天使




UID:281367
注册:2005-6-16
最后登录: 2008-09-02
帖子:1135
精华:0

可用积分:1117 (家境小康)
信誉积分:100
专家积分:5 (本版:5)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-6-18 10:02 
fcntl



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

闻道有先后,术业有专攻,如是而已。                         --《师说》韩愈(唐)

众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。    -- 辛弃疾 《青玉案》
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-10-07
帖子:4234
精华:4

可用积分:7712 (富足长乐)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2
推广积分:0

状态:...在线...

[个人空间] [短信] [博客]


6楼 发表于 2008-6-18 10:03 
对,每次操作a的时候,就先锁b。
这样使用:
flock(fd, LOCK_EX);
code
flock(fd, LOCK_UN)
这种方式是阻塞方式的,如果发现该文件还被锁着,则该进程一直阻塞直到可以获取这个文件锁



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
版主 net_robber   帅哥 (迷茫的羔羊)
版主-精灵使
堕落的鬼魂




UID:159572
注册:2004-5-20
最后登录: 2008-10-06
帖子:3477
精华:4

可用积分:5201 (富足长乐)
信誉积分:99
专家积分:10 (本版:5)
空间积分:0
推广积分:7

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2008-6-18 10:17 
以flock 函数的 LOCK_EX 参数为例
我的理解如下:

手册中解释是这样说的

Only one process may hold an exclusive                  lock

而不是

Only one process may hold an exclusive                  file

所以,独占的只是锁的状态,而不是文件

[ 本帖最后由 net_robber 于 2008-6-18 10:18 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________



新领域全方位传媒。
打破以往传统传媒单一方式让虚拟与现实完美结合。
引领新一代 《立体网络传媒文化》 。
异度圣洁诚挚的邀请您参加到我们的《彗星系统》中,与我们一起拥抱明天!
有兴趣的请联系我ZhangQuan@TimeCtrl.net




积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
lipingtababa
精灵




UID:585831
注册:2007-7-11
最后登录: 2008-10-06
帖子:231
精华:0

可用积分:237 (白手起家)
信誉积分:105
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2008-6-18 10:19 
flock的手册页说:

flock(2) places advisory locks only; given suitable permissions on a file, a process is free to ignore the use of flock(2) and perform I/O on the file.

这段话的意思是说,这个锁只是一个标记,其他进程完全可以忽略这个标记



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-10-07
帖子:4234
精华:4

可用积分:7712 (富足长乐)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2
推广积分:0

状态:...在线...

[个人空间] [短信] [博客]


9楼 发表于 2008-6-18 10:22 


QUOTE:
原帖由 lipingtababa 于 2008-6-18 10:19 发表
flock的手册页说:

flock(2) places advisory locks only; given suitable permissions on a file, a process is free to ignore the use of flock(2) and perform I/O on the file.

这段话的意思是说,这 ...

我觉得这个意思应该是一个进程使用了flock锁住某个文件,则其他进程仍然可以读写这个文件。这个是没有问题的。

但在我们应用的时候,如果在读写之前,都写使用flock先锁住该文件,然后在读写。如果该文件已经被锁住,那么另外一个进程就肯定锁不住该文件,就只好阻塞,直到可以锁住该文件。

这样子锁就有用了。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
40943460
侠客



UID:588357
注册:2007-7-17
最后登录: 2008-09-09
帖子:47
精华:0

可用积分:35 (白手起家)
信誉积分:105
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-6-18 10:31 


QUOTE:
原帖由 Godbach 于 2008-6-18 10:03 发表
对,每次操作a的时候,就先锁b。
这样使用:
flock(fd, LOCK_EX);
code
flock(fd, LOCK_UN)
这种方式是阻塞方式的,如果发现该文件还被锁着,则该进程一直阻塞直到可以获取这个文件锁

#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/file.h>

int main()
{
  int fd,return_int;
  int num;
  char *buf= "jingjing";
  char *buf1="zhangchao";
  int fd1;
  fd = open("aaa.txt",O_WRONLY);
  return_int = flock(fd,LOCK_EX);
  printf("%d\n",return_int);//输出返回的是0
  fd1 = open("bbb.txt",O_WRONLY);
  num = write(fd1,buf,strlen(buf));
  //return_int = flock(fd,LOCK_UN);
  //num = write(fd,buf1,strlen(buf));
  printf("%d\n",num);//返回的是字符串长度
  close(fd);
  return 0;

}
谢谢您哈~我按照刚才的意思写的,对aaa.txt加锁,然后对bbb.txt进行操作还是可以写进字符?我觉得我还是没有理解.
fcntl好像很复杂的样子.我想先把这个弄会.等会试验试验那个.谢谢上面的朋友哈!



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.062223 second(s), 5 queries , Gzip enabled