|
|
来自名著Unix Network Programming (UNP) v3
unpv13e/lib/readline.c
- static ssize_t
- my_read(int fd, char *ptr)
- {
- if (read_cnt <= 0) {
- again:
- if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {
- if (errno == EINTR)
- goto again;
- return(-1);
- } else if (read_cnt == 0)
- return(0);
- read_ptr = read_buf;
- }
- read_cnt--;
- *ptr = *read_ptr++;
- return(1);
- }
复制代码
基础教科书一再强调不用goto(标识符可见域污染危险、程序结构破坏等罪名),不各知道UNP为什么还用。改成下面这样,能不能达到等价呢?
- static ssize_t
- my_read(int fd, char *ptr)
- {
- if (read_cnt <= 0) {
- while(1) {
- if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {
- if (errno == EINTR)
- continue;
- return(-1);
- } else if (read_cnt == 0)
- return(0);
- else
- break;
- }
- read_ptr = read_buf;
- }
- read_cnt--;
- *ptr = *read_ptr++;
- return(1);
- }
复制代码 |
|