ホームページ >バックエンド開発 >PHPチュートリアル >RIO パッケージの堅牢な I/O 関数コード_PHP チュートリアル
[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
}
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 の関数のみを使用できます。ネットワーク通信では、このメカニズムは非常に多くの方法で使用されています。