ホームページ  >  記事  >  バックエンド開発  >  RIO パッケージの堅牢な I/O 関数コード_PHP チュートリアル

RIO パッケージの堅牢な I/O 関数コード_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:12:02901ブラウズ

[php]
以下は

についてです

次は[php] についてです
#include  
#include  
#include  
#include  
#include  
#include  
 
#MAXLINE 1024 を定義
 
/*入出力関数のバッファリングを解除*/
 
ssize_t rio_readn(int fd,void *usrbuf,size_t n)
{
    size_t nleft = n; 
    ssize_t nread; 
    char *bufp = usrbuf; 
 
    while(nleft > 0){
        if((nread = read(fd,bufp,nleft))             if(errno == EINTR){/*sig ハンドラー return によって中断されました*/
                nread = 0; 
            }その他{
                return -1;/*エラー*/
            }
        }else if(nread == 0){
            壊す;  /*EOF*/
        }else{/*内容を読む*/
            nleft -= nread; 
            bufp += nread; 
        }
    }
    戻り値 (n - nleft); 
}
 
ssize_t rio_writen(int fd,void *usrbuf,size_t n)
{
    size_t nleft = n; 
    ssize_t nwrite; 
    char *bufp = usrbuf; 
 
    while(nwrite = write(fd,bufp,nleft)         if(errno == EINTR){
            nwrite = 0; 
        }その他{
            -1 を返します。 
        }
        nleft -= nwrite; 
        bufp += nwrite; 
    }
    n を返します。 
}
/************************************************* ****************************/
#define RIO_BUFSIZE 8192
typedef 構造体{
    int rio_fd; /*ファイルディスクリプタを操作するには*/
    int rio_cnt;/*内部バッファ内の未読のバイト*/
    char *rio_bufptr;/*次の未読バイト int 内部 buf*/
    char rio_buf[RIO_BUFSIZE];/*内部バッファ*/
}暴動; 
void rio_readinitb(rio_t *rp,int fd)
{
    rp->rio_fd = fd; 
    rp->rio_cnt = 0; 
    rp->rio_bufptr = rp->rio_buf; 
}
static ssize_t rio_read(rio_t *rp,char *usrbuf,size_t n)
{
    int cnt; 
    while(rp->rio_cnt         rp->rio_cnt = read(rp->rio_fd, rp->rio_buf,sizeof(rp->rio_buf)); 
        if(rp->rio_cnt             if(errno != EINTR){
                -1 を返します。 
            }
        }else if(rp->rio_cnt == 0){/*EOF*/
            0を返します。 
        }else {/*リセット buf ptr*/
            rp->rio_bufptr = rp->rio_buf; 
        }
    }
    /* n rio_cnt、何度かコピーする必要があります */
    cnt = n; 
    if(rp->rio_cnt < n){/*ワンタイムコピー終了*/
        cnt = rp->rio_cnt; 
    }
    memcpy(usrbuf,rp->rio_bufptr,cnt); 
    rp->rio_bufptr += cnt; 
    rp->rio_cnt -= cnt; 
    cntを返します。 
}
ssize_t rio_readlineb(rio_t *rp, void *usrbuf,size_t maxlen)
{
    int n,rc; 
    char c,*bufp = usrbuf; 
    for(n = 1; n         if (( rc = rio_read(rp,&c,1)) == 1){
            *bufp++ = c; 
            if(c == 'n'){
                壊す; 
            }
        }else if (rc == 0){
            if(n == 1){/*EOF データ読み取りなし*/
                0を返します。 
            }else{/*EOF にデータが読み取られます*/
                壊す; 
            }
        }else{/*エラー*/
            -1 を返します。 
        }
    }
    *bufp = 0;/*文字列終了記号 :' '*/
    n を返します。 
}
 
ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_t n)
{
    size_t nleft = n; 
    ssize_t nread; 
    char *bufp = usrbuf; 
 
    while(nleft > 0){
        if((nread = rio_read(rp,bufp, nleft))             if(errno == EINTR){/*sig ハンドラー return によって中断されました*/
                nread =0; 
            }else{/*read() によって設定されたエラー番号 */
                -1 を返します。 
            }
        }else if(nread == 0){/*EOF*/
            壊す; 
        }
        nleft -= nread; 
        bufp += nread; 
    }
    return (n-nleft);/*return >=0*/
}
 
int main()
{
    int n; 
    rio_t リオ; 
    char buf[MAXLINE]; 
 
    int fd = open("1.txt",O_RDONLY,755); 
    if(fd         printf("エラー"); 
    }
    rio_readinitb(&rio,fd); 
    while ((n = rio_readlineb(&rio,buf,MAXLINE)) != 0){
           rio_writen(1,buf,n); 
    }
    閉じる(fd); 
    0を返します。 
}

#include
#include
#include
#include
#include
#include

#MAXLINE 1024 を定義する

/*バッファリング解除入出力関数*/

ssize_t rio_readn(int fd,void *usrbuf,size_t n)
{
    size_t nleft = n;
    ssize_t nread;
    char *bufp = usrbuf;

while(nleft > 0){
        if((nread = read(fd,bufp,nleft))             if(errno == EINTR){/*sig ハンドラー return によって中断されました*/
                nread = 0;
            }その他{
                return -1;/*エラー*/
            }
        }else if(nread == 0){
            壊す;  /*EOF*/
        }else{/*内容を読む*/
            nleft -= nread;
            bufp += nread;
        }
    }
    return (n - nleft);
}

ssize_t rio_writen(int fd,void *usrbuf,size_t n)
{
    size_t nleft = n;
    ssize_t nwrite;
    char *bufp = usrbuf;

while(nwrite = write(fd,bufp,nleft)         if(errno == EINTR){
            nwrite = 0;
        }その他{
            -1 を返します;
        }
        nleft -= nwrite;
        bufp += nwrite;
    }
    返します;
}
/************************************************* ****************************/
#RIO_BUFSIZE 8192 を定義します
typedef 構造体{
    int rio_fd; /*ファイルディスクリプタを操作するには*/
    int rio_cnt;/*内部 buf の未読バイト数*/
    char *rio_bufptr;/*次の未読バイト int 内部 buf*/
    char rio_buf[RIO_BUFSIZE];/*内部バッファ*/
}リオ_t;
void rio_readinitb(rio_t *rp,int fd)
{
    rp->rio_fd = fd;
    rp->rio_cnt = 0;
    rp->rio_bufptr = rp->rio_buf;
}
static ssize_t rio_read(rio_t *rp,char *usrbuf,size_t n)
{
    int cnt;
    while(rp->rio_cnt         rp->rio_cnt = read(rp->rio_fd, rp->rio_buf,sizeof(rp->rio_buf));
        if(rp->rio_cnt             if(errno != EINTR){
                -1 を返します;
            }
        }else if(rp->rio_cnt == 0){/*EOF*/
            0 を返す;
        }else {/*リセット buf ptr*/
            rp->rio_bufptr = rp->rio_buf;
        }
    }
    /* n rio_cnt、何度かコピーする必要があります */
    cnt = n;
    if(rp->rio_cnt         cnt = rp->rio_cnt;
    }
    memcpy(usrbuf,rp->rio_bufptr,cnt);
    rp->rio_bufptr += cnt;
    rp->rio_cnt -= cnt;
    CNTを返します;
}
ssize_t rio_readlineb(rio_t *rp, void *usrbuf,size_t maxlen)
{
    int n,rc;
    char c,*bufp = usrbuf;
    for(n = 1; n         if (( rc = rio_read(rp,&c,1)) == 1){
            *bufp++ = c;
            if(c == 'n'){
                休憩;
            }
        }else if (rc == 0){
            if(n == 1){/*EOF データ読み取りなし*/
                0 を返す;
            }else{/*EOF 一部のデータの読み取り*/
                休憩;
            }
        }else{/*エラー*/
            -1 を返します;
        }
    }
    *bufp = 0;/*文字列終了記号 :' '*/
    返します;
}

ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_t n)
{
    size_t nleft = n;
    ssize_t nread;
    char *bufp = usrbuf;

while(nleft > 0){
        if((nread = rio_read(rp,bufp, nleft))             if(errno == EINTR){/*sig ハンドラー return によって中断されました*/
                nread =0;
            }else{/*read() によって設定されたエラー番号 */
                -1 を返します;
            }
        }else if(nread == 0){/*EOF*/
            休憩;
        }
        nleft -= nread;
        bufp += nread;
    }
    return (n-nleft);/*return >=0*/
}

int main()
{
    int n;
    rio_t リオ;
    char buf[MAXLINE];

int fd = open("1.txt",O_RDONLY,755);
    if(fd         printf("エラー");
    }
    rio_readinitb(&rio,fd);
    while ((n = rio_readlineb(&rio,buf,MAXLINE)) != 0){
           rio_writen(1,buf,n);
    }
    閉じる(fd);
    0 を返す;
}


上の関数式RIOパケットが提供する2種類の異なる関数:

1、不带缓冲の入出力関数

2、带缓冲の入力関数

ここでは主にファイル Io を使用します。標準 Io 自体が危険であるため、ファイルを読み込む際には標準の Io 関数を優先的に使用しますが、ネットワーク プロセスでは、ファイル Io の関数のみを使用できます。ネットワーク通信では、このメカニズムは非常に多くの方法で使用されています。

http://www.bkjia.com/PHPjc/477281.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477281.html技術記事 [php] 以下は[php] #include stdio.h #include string.h #include errno.h #include sys/types.h #include fcntl.h #include sys/stat.h #define MAXLINE 1024 /*うんぶ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。