ファイルI/Oプログラミングfcntl関数説明_2

5486 ワード


fcntl()関数の機能は多く、開いているファイルの性質を変えることができますが、本稿ではファイルロックの取得/設定に関する機能について説明します.fcntl()の関数プロトタイプは、int fcntl(int fd,int cmd,struct flock*lock);
 
	struct flock {
            			 ...
            			 short l_type;    /* Type of lock: F_RDLCK,
           		                     		 F_WRLCK, F_UNLCK */
           		 	 short l_whence;  /* How to interpret l_start:
           		                     		 SEEK_SET, SEEK_CUR, SEEK_END */
          		 	  off_t l_start;   /* Starting offset for lock */
          		 	  off_t l_len;     /* Number of bytes to lock */
          		  	 pid_t l_pid;     /* PID of process blocking our lock
           	                      			(F_GETLK only) */
       	     		 		...
       		 	 };

  
  
  
  

 flock  ,l_type  , :F_RDLCK( )、F_WRLCK( )

F_UNLCK( );l_pid  ;l_whence、l_start  l_end 

, 。 , 。l_whence   SEEK_SET、

SEEK_CUR   SEEK_END  , 、 。l_whence   l_start  ,

l_start  。


· F_GETLK:  fd  。 ,lock  (

)。 ,  lock   flock  ,  lock   flock 

,  PID   l_pid  , ; ,  lock   flock   l_type   F_UNLCK,  

flock  , 。


· F_SETLK: (l_type  F_RDLCK   F_WRLCK) (l_type  F_UNLCK),

,  fcntl() 

· F_SETLKW:  F_SETLK  , , , , 。

,F_GETLK  ,  F_GETLK  ,F_SETLK   F_SETLKW  ,

, ,  F_SETLK   F_SETLKW  ,

。 ,F_SETLKW  。 , ,

, 。

fcntl()  , , , 。 ,

,  O_NONBLOCK  , ,  O_NONBLO

CK, ; , 。cmd   F_SETFL  。

 


また、システム呼び出しfcntl()は、貸し出しロックにも使用できます.この場合、使用される関数のプロトタイプは次のとおりです.
 
	int fcntl(int fd, int cmd, long arg);

cmd :F_SETLEASE F_GETLEASE。 :

  • F_SETLEASE:以下に説明するargパラメータで指定した値に基づいてリースを作成または削除します.
  • F_RDLCK:リードリースを設定します.ファイルが別のプロセスによって書き込みで開くと、リースを所有する現在のプロセスに
  • の通知が受信されます.
  • F_WRLCK:リースの書き込みを設定します.ファイルが別のプロセスによって読み書きで開くと、そのリースを所有する現在のプロセスは
  • の通知を受け取る.
  • F_UNLCK:以前に作成したリースを削除する
  • F_GETLEASE:呼び出しプロセスがファイル上のどのタイプのロックを持っているかを示します.これは戻り値によって決定する必要があります.戻り値は3種類あります.F_RDLCK、F_WRLCKとF_UNLC
  • Kは、呼び出しプロセスがファイルに対して読み取り、書き込み、または
  • を所有していることを示しています.
    プロセスによっては、ファイル上でF_SETLEASEが設定したレンタルロックが衝突すると、カーネルがこのシステム呼び出しをブロックします.また、カーネルはこのレンタルロックを持つプロセスに信号を送り、このことを通知します.このリースロックを所有するプロセスは、この信号をフィードバックし、このリースロックを削除したり、このリースロックのリース契約を短縮したりして、ファイルを他のプロセスにアクセスできるようにします.レンタルロックを持つプロセスが所定の時間内に上記の操作を完了できない場合、システムは強制的に完了します.F_経由SETLEASEコマンドargパラメータをF_に指定UNLCKではこのレンタルロックを削除できます.このリースロックに対してリースを短縮したり、削除したりする操作がプロセスが自発的であってもカーネルが強制的であっても、ブロックされたシステム呼び出しが呼び出しを発行していないプロセスがブロックを解除していない限り、システムはこのシステム呼び出しの実行を許可する.ブロックされたシステム呼び出しが何らかの理由でブロックを解除されたとしても、リースロックを短縮したり、削除したりするプロセスは実行されます.なお、レンタルロックはファイル全体に対してのみ有効であり、記録レベルのロックは実現できない.