UNIX 網路程式設計學習(7)--readn,writen,readline的實現
readn函式:
//lib/readn.c
/* include readn */
#include "unp.h"
ssize_t /* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
size_t nleft;
ssize_t nread;
char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0) {
if (errno == EINTR)
nread = 0; /* and call read() again */
else
return(-1);
} else if (nread == 0)
break; /* EOF */
nleft -= nread;
ptr += nread;
}
return(n - nleft); /* return >= 0 */
}
/* end readn */
ssize_t
Readn(int fd, void *ptr, size_t nbytes)
{
ssize_t n;
if ( (n = readn(fd, ptr, nbytes)) < 0)
err_sys("readn error");
return(n);
}
writen函式:
//lib/writen.c
/* include writen */
#include "unp.h"
ssize_t /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
/* end writen */
void
Writen(int fd, void *ptr, size_t nbytes)
{
if (writen(fd, ptr, nbytes) != nbytes)
err_sys("writen error");
}
readline函式:
lib/readline.c
//效率提高了,比每次呼叫read讀一個位元組效率要高。
/* include readline */
#include "unp.h"
static int read_cnt;//剛開始可以置為一個負值(我的理解)
static char *read_ptr;
static char read_buf[MAXLINE];
static ssize_t
my_read(int fd, char *ptr)//每次最多讀取MAXLINE個字元,呼叫一次,每次只返回一個字元
{
if (read_cnt <= 0) {
again:
if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {//如果讀取成功,返回read_cnt=讀取的字元 if (errno == EINTR)
goto again;
return(-1);
} else if (read_cnt == 0)
return(0);
read_ptr = read_buf;
}
read_cnt--;//每次遞減1,直到<0讀完,才執行上面if的命令。
*ptr = *read_ptr++;//每次讀取一個字元,轉移一個字元
return(1);
}
ssize_t
readline(int fd, void *vptr, size_t maxlen)
{
ssize_t n, rc;
char c, *ptr;
ptr = vptr;
for (n = 1; n < maxlen; n++) {
if ( (rc = my_read(fd, &c)) == 1) {
*ptr++ = c;
if (c == '\n')
break; /* newline is stored, like fgets() */
} else if (rc == 0) {
*ptr = 0;
return(n - 1); /* EOF, n - 1 bytes were read */
} else
return(-1); /* error, errno set by read() */
}
*ptr = 0; /* null terminate like fgets() */
return(n);
}
ssize_t
readlinebuf(void **vptrptr)
{
if (read_cnt)
*vptrptr = read_ptr;
return(read_cnt);
}
/* end readline */
ssize_t
Readline(int fd, void *ptr, size_t maxlen)
{
ssize_t n;
if ( (n = readline(fd, ptr, maxlen)) < 0)
err_sys("readline error");
return(n);
}
相關文章
- UNIX網路程式設計學習(13)--使用select的str_cli函式的實現程式設計函式
- UNIX網路程式設計學習(16)--使用poll的TCP伺服器程式程式設計TCP伺服器
- UNIX網路程式設計學習(4)--值-結果引數程式設計
- Unix哲學(Unix程式設計藝術)程式設計
- Unix程式設計藝術,Unix哲學程式設計
- UNIX網路程式設計學習(9)--getsockname和getpeername的用法及例項程式設計
- UNIX網路程式設計學習(15)--使用單程式和select的TCP伺服器程式程式設計TCP伺服器
- 《Unix 網路程式設計》15:Unix 域協議程式設計協議
- UNIX網路程式設計學習(3)--簡單時間獲取伺服器程式程式設計伺服器
- UNIX網路程式設計學習(18)--UDP回射(伺服器+客戶端)程式程式設計UDP伺服器客戶端
- UNIX網路程式設計學習(1)--開啟ubuntu daytime服務程式設計Ubuntu
- 學習網路安全能解決哪些現實問題?網路安全學習
- JAVA學習線路:day14-網路程式設計Java程式設計
- 學習程式設計常用網站分享程式設計網站
- 網路程式設計學習筆記程式設計筆記
- 物聯網學習教程—Linux系統程式設計之多工實現(二)Linux程式設計
- Unix高階程式設計學習筆記--系統呼叫簡介程式設計筆記
- 好程式設計師Python學習路線分享實現快速排序演算法程式設計師Python排序演算法
- 程式程式設計1 – Unix環境高階程式設計7章讀書筆記程式設計筆記
- .Net程式設計師安卓學習之路2:訪問網路API程式設計師安卓API
- [C練習]程式設計實現strstr程式設計
- 程式碼審計是什麼?網路安全實戰學習技能
- 程式設計實習MOOC/6908/C:簡單的學生資訊處理程式實現程式設計
- 程式設計學習MarkDown學習程式設計
- 《Unix 網路程式設計》05:TCP C/S 程式示例程式設計TCP
- UNIX網路程式設計 卷2:程式間通訊程式設計
- JAVA實現網路程式設計之併發程式設計Java程式設計
- Python學習之網路程式設計Python程式設計
- UNIX網路程式設計學習(12)--對兩個數求和的str_echo函式-以及sscanf的用法程式設計函式
- 程式設計師如何實現“網際網路+”07-如何提高網站流量程式設計師網站
- python網路程式設計學習筆記(3):socket網路伺服器Python程式設計筆記伺服器
- 程式設計字典-Java(JavaEE)學習線路圖程式設計Java
- Python程式設計師學習路線圖Python程式設計師
- 學習Python程式設計哪種線路科學?Python程式設計
- UNIX網路程式設計 卷2 原始碼使用程式設計原始碼
- UNIX網路程式設計學習(17)--檢查套接字選項是否受支援並獲取預設值程式設計
- 程式設計師如何實現“網際網路+”01-程式設計師走向自由職業的 5 種常見方式程式設計師
- UNIX網路程式設計學習(8)--伺服器端顯示客戶端的IP地址和埠號程式設計伺服器客戶端