LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 701|回复: 5

为什么就上锁了?

[复制链接]
发表于 2009-5-4 09:25:38 | 显示全部楼层 |阅读模式
请大虾们帮助指点一下:

  请看这个程序:

     fd = open( "somefile.lck " , O_RDONLY ,0644 ) ;

       if( fd >= 0 )

             {
                    close( fd ) ;
                    
                    printf( " the file is already locked ")  ;

                    return   1 ;
             }
      
        else
            
             {
                    // the lock file dose not exist ,we can lock it and access it

                    fd = open( "somefile.lck " ,O_WRONLY|O_CREAT ,0644 )  ;

                    if( fd <0 )

                          {
                                    perror(  " error creating lock file ")  ;

                                   return 1 ;
                           }

                      ..................// write our pid to the file

                      close (  fd ) ;

               }  

    请问:为什么在第一个open后判断 fd >=0 就说明文件就锁定了呢?
          为什么第二个open后我们就知道所不存在,别弄个要创建一个锁呢?
               
    谢谢!
发表于 2009-5-4 09:59:58 | 显示全部楼层
当open成功执行,说明somefile.lck文件存在,已经有一个实例正在执行,程序返回。如果somefile.lck不存在(open没有成功),则创建一个文件,并把自己的进程ID写入,以便其它进程访问。
进程间通讯的一种方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-4 21:47:19 | 显示全部楼层
Post by Kevin_Chou;1982996
当open成功执行,说明somefile.lck文件存在,已经有一个实例正在执行,程序返回。如果somefile.lck不存在(open没有成功),则创建一个文件,并把自己的进程ID写入,以便其它进程访问。
进程间通讯的一种方法。



谢谢您的回复:
我想问的是,我想打开一个文件,当然存在着目的性的,这个文件很有可能就存在。现在当open成功时,说明somefile.lck存在。那就不可能一个文件存在但只是存在(即验证了有这个文件,不用创建了),我怎么知道有一个实例正在运行或者在使用这个文件呢?说白了,这个锁是个什么东西?“锁定文件”是怎么体现出来的在这个程序中?
回复 支持 反对

使用道具 举报

发表于 2009-5-4 22:08:03 | 显示全部楼层
不太明白你的意思。

单纯就你贴出来的代码来说。somefile.lck文件的生命周期是由一个程序控制的(服务器端),当服务器第一次运行就会创建somefile.lck文件,并把自己的PID写进去,当服务器结束时会删除somefile.lck文件。客户端启动时也会打开somefile.lck文件,当打开成功并取得服务器端PID后就会与服务器进行通信。

对于服务器端来说,看以把somefile.lck文件看做一个信号灯,somefile.lck不存在的时候相当于绿灯,可以继续执行;somefile.lck存在时相当于红灯,程序直接返回。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-5 21:47:30 | 显示全部楼层
Post by Kevin_Chou;1983316
不太明白你的意思。

单纯就你贴出来的代码来说。somefile.lck文件的生命周期是由一个程序控制的(服务器端),当服务器第一次运行就会创建somefile.lck文件,并把自己的PID写进去,当服务器结束时会删除somefile.lck文件。客户端启动时也会打开somefile.lck文件,当打开成功并取得服务器端PID后就会与服务器进行通信。

对于服务器端来说,看以把somefile.lck文件看做一个信号灯,somefile.lck不存在的时候相当于绿灯,可以继续执行;somefile.lck存在时相当于红灯,程序直接返回。


    哦,我的这个例子取自一本叫做《linux应用程序设计》的书,书中用它来讲文件锁,就是锁定文件的锁。也就是当想访问一个文件时先要对之加锁,进行互斥操作。
  我不明白的,也就是我想在这里请教的就是我不知道这怎么就加锁了,“锁”是如何体现的?
   
顺便问一个问题:
     打印语句:printf(JOB_STATUS_FORMAT,job->jobId,"running",job->text) ;
        请您帮我解释一下这个printf函数原来没这么复杂的,只是这一种这么写的格式是个什么逻辑关系(运行时)?JOB_STATUS_FORMAT是个什么东西?本来在程序的最前面是有JOB_STATUS_FORMAT的定义。如:#define JOB_STATUS_FORMAT  "[%d]%-22s%.40s\n"

  谢谢您。
回复 支持 反对

使用道具 举报

发表于 2009-5-7 10:24:14 | 显示全部楼层
Post by hellodushiping;1983752
哦,我的这个例子取自一本叫做《linux应用程序设计》的书,书中用它来讲文件锁,就是锁定文件的锁。也就是当想访问一个文件时先要对之加锁,进行互斥操作。
  我不明白的,也就是我想在这里请教的就是我不知道这怎么就加锁了,“锁”是如何体现的?
   
顺便问一个问题:
     打印语句:printf(JOB_STATUS_FORMAT,job->jobId,"running",job->text) ;
        请您帮我解释一下这个printf函数原来没这么复杂的,只是这一种这么写的格式是个什么逻辑关系(运行时)?JOB_STATUS_FORMAT是个什么东西?本来在程序的最前面是有JOB_STATUS_FORMAT的定义。如:#define JOB_STATUS_FORMAT  "[%d]%-22s%.40s\n"

  谢谢您。


文件锁不是指那个文件被锁定了,而是指把那个文件当成锁来使用。
JOB_STATUS_FORMAT就是一个宏定义,在程序中展开后就是字符串。

LZ得补补基础
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表