Linuxシステム呼び出しとファイルI/O(二)

7610 ワード

fcntl関数は、開いているファイルの性質を変更できます.include #include #include int fcntl(int filedes,int cmd,...);戻る:成功するとcmdに依存し、エラーが発生すると-1
.fcntlでファイルにロックをかける:複数のユーザーが1つのファイルを共同で使用し、操作する場合、linuxは通常、共有リソースの競合を回避するためにファイルにロックをかける方法を採用する.
争の状態ファイルロックには、推奨ロックと強制ロックが含まれます.推奨ロックは、ファイルをロックするプロセスがロックが存在するかどうかを検出し、既存のロックを尊重することを要求します.
を選択します.強制ロックカーネルとシステムによって実行されるロック.fcntlは、推奨ロックを実現するだけでなく、強制ロックを実施することができる.   >F_RDLCK---共有リードロック>F_WRLCK---独占書き込みロック>F_UNLCK--1つの領域がロックまたはロック解除される領域の開始アドレスをロック解除し、l_startとl_whence両者が決める.l_startは相対変位量(バイト)、l_ホワイトは決めた
相対変位量の起点領域の長さl_len表示
ロックおよびロック解除領域の説明:>ファイルの開始位置より前に>若l_lenは0であり、ロックされた領域がその始点から最大可能な位置まで、すなわちファイルデータがロックされた範囲にあることを示す>通常l_start説明は0,l_whence説明はSEEK_SET,l_lenは0としてファイル全体をロックする
.ioctl関数:ioctl関数はI/O操作の雑物箱であり、他の関数で表すことができないI/O操作は通常ioctlで表すことができる.端末I/Oはioctlの最上位
主に設備のI/O制御に用いられる.include #include int ioctl(int filedes,int request,...);エラーが発生した場合は-1、成功した場合は別の値を返します.
.select実装I/O多重化:I/O処理の5つのモデル:1>ブロックI/Oモデル:呼び出されたI/O関数が関連機能を完了していないとプロセスが保留され、関連データが到着するまで戻る:端末、ネットワークデバイスのアクセス2>非ブロックモデル:要求されたI/O操作が完了できない場合、プロセスをスリープさせず、open、read、writeなどのエラーが返される.3>I/O多重化モデル:要求されたI/O操作がブロックされ、実際にI/Oがブロックされていない場合、その関数の1つを待機させる.
その間、I/Oは他の操作もできます.例:select関数.4>信号駆動I/Oモデル:このモデルの下で、信号処理プログラムをインストールすることで、システムは特定の信号の到来を自動的にキャプチャすることができる.
I/O.5>非同期I/Oモデルを起動する:このモデルでは、記述子がI/Oを起動する準備ができている場合、プロセスはカーネルにカーネルに通知し、カーネルによって実行されます.
後続処理
ファイル記述子の処理は主に4つのマクロ関数を設計する:FD_ZERO(fd_set*set):ファイル記述子セットFD_をクリアするSET(int fd,fd_set*set)ファイル記述子をファイル記述子セットFD_に追加CLR(int fd,fd_set*set)ファイル記述子をファイル記述子セットからFD_を消去するISSET(int fd,fd_set*set)このセットの1つの位置決めに変化があるかどうかをテストする
select関数を使用する前に、まずFD_を使用します.ZEROとFD_SETファイル記述子セットを初期化し、selectを使用する場合、FD_をリサイクルできます.ISSETテスト
ディスクリプタセット、関連するファイルディスクリプタの実行が完了したらFD_を使用CLRは記述子セットをクリアする.Example: select.c
/*select.c*/
// 10 7
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>

int main(void)
{
int fds[2];
char buf[7];
int i,rc,maxfd;
fd_set inset1,inset2;
struct timeval tv;

if((fds[0] = open ("hello1", O_RDWR|O_CREAT,0666))<0)
perror("open hello1");
if((fds[1] = open ("hello2", O_RDWR|O_CREAT,0666))<0)
perror("open hello2");
if((rc = write(fds[0],"Hello!
",7)))
printf("rc=%d
",rc);

lseek(fds[0],0,SEEK_SET);
maxfd = fds[0]>fds[1] ? fds[0] : fds[1];

FD_ZERO(&inset1);
FD_SET(fds[0],&inset1);
FD_ZERO(&inset2);
FD_SET(fds[1],&inset2);
tv.tv_sec=2;
tv.tv_usec=0;
while(FD_ISSET(fds[0],&inset1)||FD_ISSET(fds[1],&inset2))
{
if(select(maxfd+1,&inset1,&inset2,NULL,&tv)<0)
perror("select");
else
{
if(FD_ISSET(fds[0],&inset1))
{
rc = read(fds[0],buf,7);
if(rc>0)
{
buf[rc]='\0';
printf("read: %s
",buf);
}
else
perror("read");
}
if(FD_ISSET(fds[1],&inset2))
{
rc = write(fds[1],buf,7);
if(rc>0)
{
buf[rc]='\0';
printf("rc=%d,write: %s
",rc,buf);
}
else
perror("write");
sleep(10);
}
}
}
exit(0);
}