Chinaunix首页 | 论坛 | 博客
  • 博客访问: 688105
  • 博文数量: 240
  • 博客积分: 3616
  • 博客等级: 大校
  • 技术积分: 2663
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-21 23:59
文章分类

全部博文(240)

文章存档

2013年(6)

2012年(80)

2011年(119)

2010年(35)

分类: LINUX

2010-10-20 17:50:05

下面认真分析fcntl_write.c函数
#include
#include
#include
#include
#include
void lock_set(int fd,int type);
void lock_set(int fd,int type)
{
 struct flock lock;//定义一个结构体lock
 lock.l_whence =SEEK_SET;//给结构体的有关成员赋值,这里的SEEK_SET与lseek里的代表含义一样
 lock.l_start=0;
 lock.l_len=0;
 while(1)
 {
  lock.l_type=type;
  if((fcntl(fd,F_SETLK,&lock))==0)
  {
   if(lock.l_type ==F_RDLCK)
   {
    printf("read lock set by %d\n",getpid());
   }
   else if(lock.l_type==F_WRLCK)
   {
    printf("write lock set by %d\n",getpid());
   }
   else if (lock.l_type==F_UNLCK)
   {
    printf("release lock by %d\n",getpid());
   }
  return;
  }
  fcntl(fd,F_GETLK,&lock);
  if(lock.l_type !=F_UNLCK)
  {
   if(lock.l_type==F_RDLCK)
   {
    printf("read lock already set by %d\n",lock.l_pid);
   }
   else if(lock.l_type ==F_WRLCK)
   {
    printf("write lock already set by %d\n",lock.l_pid);
   }
   getchar();
  }
 }
}
int main(void)
{
 int fd;
 fd=open("hello",O_RDWR | O_CREAT,0666);//打开hello文件
 if(fd<0)//判断打开是否正确
 {
  perror("open");
  exit(1);
 }
 lock_set(fd,F_WRLCK);
 getchar();
 lock_set(fd,F_UNLCK);
 getchar();
 close(fd);
 exit(0);
 
}
/*-----------------------------
notes:
1.fcntl函数说明:
1)当多个用户共同使用,操作一个文件的情况,这时,linux通常采用的方法是
给文件上锁,来避免共享的资源产生竞争的状态。
2)文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查
是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性
锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核
将阻止其他任何文件对其进行读写操作。
3)在linux中,实现文件上锁的函数有lock和fcntl,其中lock用于对文件施加建议
性锁,而fcntl不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对
文件的某一记录进行上锁,也就是记录锁。
4)记录锁又可分为读取锁和写入锁,其中读取又称为共享锁,它能够使多个进程
都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有
一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立
读取锁和写入锁。
2.lock的结构如下:
struct flock
{
 short l_type;
 short l_start;
 short l_whence;
 off_t l_len;
 pid_t l_pid;
}
下面具体指出各自的意义:
1)l_type:
F_RDLCK:读取锁(共享锁)
F_WRLCK:写入锁(排斥琐)
F_UNLCK:解锁
2)l_start:相对位移量(字节)
3)l_whence:相对位移量的起点(同lseek的whence)
4)l_len:加锁区域的长度
说明:
为加锁整个文件,通常的方法是将l_start说明为0,l_whence说明为SEEK_SET,l_len
说明为0.
3.fcntl函数语法要点:
1)所需头文件
#include
#include
#include
2)函数原型
int fcntl(int fd,int cmd,struct flock *lock)
3)输入参数
fd:文件描述符
cmd:
F_DUPFD:复制文件描述符
F_GETFD:获得fd的clode-on-exec标志,若标志未设置,则文件经过exec函数之后
仍保持打开状态
F_SETFD:设置close-on-exec标志,该标志以参数arg的FD_CLOEXEC位决定
F_GETFL:得到open设置的标志
F_SETFL:改变open设置的标志
F_GETFK:根据lock描述,决定是否上文件锁。
F_SETFK:设置lock描述的文件锁。
F_SETLKW:这是F_SETLK的阻塞版本(命令名中的W表示等待(wait)).如果存在其他锁,
则调用进程睡眠,如果捕捉到信号则睡眠中断
F_GETOWN:检索将收到SIGIO和SIGURG信号的进程号或进程组号。
F_SETOWN:设置进程号或进程组号。
lock:
结构为flock,记录设置锁的具体状态。
4)函数返回值
成功:0
-1:出错
4.getchar(由标准输入设备内读进一字符)
1)所需头文件
#include
2)函数原型
int getchar(void);
3)函数说明
getchar()用来从标准输入设备中读取一个字符。然后将该字符从unsigned char 转换成int
后返回.
4)返回值
getchar()会返回读取到的字符,若返回EOF则表示有错误发生。
---------------------------------*/
阅读(727) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-21 11:39:48

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com