【Linux网络编程】read返回值总结以及封装nread

函数示例

慢速系统可能造成进程阻塞,慢速系统调用调用被系统中断后 可以选择重启

int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr)
{
	int n;
	again:
	if ( (n = accept(fd, sa, salenptr)) < 0) {
		if ((errno == ECONNABORTED) || (errno == EINTR))
			goto again;
		else
			perr_exit("accept error");
	}
	return n;
}
ssize_t Read(int fd, void *ptr, size_t nbytes)
{
	ssize_t n;
again:
	if ( (n = read(fd, ptr, nbytes)) == -1) {
		if (errno == EINTR)
			goto again;
		else
			return -1;
	}
	return n;
}


read返回值

  1. 正常返回>0的值 为实际的字节数 buf=1024 可以输出1024或者小于1024的值,当返回值小于1024 说明读到结尾了
  2. =0时 数据读完(读到文件、管道末尾、socket末尾)管道写端关闭,读到0值 ,socket对端关闭,返回0值,如果对端没有关闭,不会返回0会阻塞
  3. -1说明异常出现
1. errno==EINTR 被信号中断 重启/quit
2. errno==EAGAIN(EWOULDBLOCK) 之前设置的是以非阻塞方式读并且没有数据
3. 其他值 出现错误

封装nread函数

ssize_t 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;
			else
				return -1;
		} else if (nread == 0)
			break;
		nleft -= nread;
		ptr += nread;
	}
	return n - nleft;
}

你可能感兴趣的:(Linux系统编程)