- 论坛徽章:
- 1
|
本帖最后由 Gnixfeng 于 2014-11-22 11:09 编辑
问题已解决,太专注于别的东西,又犯低级错误了!nread声明为size_t类型,即是一个无符号的长整数的类型!所以不可能等于负数!
使用线程在一个非阻塞的sock中读固定个字节的内容,出现了很奇怪的问题,下面是代码- ssize_t
- readn(int fd, void *vptr, size_t n)
- {
- size_t nleft;
- size_t nread;
- char *ptr;
- ptr = vptr;
- nleft = n;
- while(nleft > 0) {
- if ( (nread = read(fd, ptr, nleft)) < 0) {
- if (nread < 0 && errno == EINTR){
- nread = 0; /* call again */
- }else if (errno == EAGAIN || errno == EWOULDBLOCK){
- continue; /* nonblocking */
- }else
- return(-1); /* error */
- }else if(nread == 0)
- break;
-
- nleft -= nread;
- ptr += nread;
- }
- return(n - nleft);
- }
复制代码 上面这段代码一直没有返回,但是在gdb中readn这里设置断点调试却可以正常返回,如果不设置断点照样出不返回!奇怪了!
然后修改了一下代码,如下- ssize_t
- readn(int fd, void *vptr, size_t n)
- {
- size_t nleft;
- size_t nread;
- char *ptr;
- ptr = vptr;
- nleft = n;
- int i = 0; /* 用完删除*/
- printf("read size %d\n", n);
- while(nleft > 0) {
- if ( (nread = read(fd, ptr, nleft)) < 0) {
- if (nread < 0 && errno == EINTR){
- nread = 0; /* call again */
- }else if (errno == EAGAIN || errno == EWOULDBLOCK){
- continue; /* nonblocking */
- }else
- return(-1); /* error */
- }else if(nread == 0)
- break;
- if ( i < 10)
- printf("nread = %d errno = %d\n", nread, errno);
- i++;
- nleft -= nread;
- ptr += nread;
- }
- return(n - nleft);
- }
复制代码 使用上面的代码读16个字节的输出如下
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
nread = 16 errno = 11
nread = -1 errno = 11
nread = -1 errno = 11
。。。
已经读了16字节依然没有返回!
如果在 if ( (nread = read(fd, ptr, nleft)) < 0) {}中加入输出语句,发现根本没有输出, if ( (nread = read(fd, ptr, nleft)) < 0) {}中的代码根本没有没有执行!即使read返回-1!但是这些代码在gdb中设置断点在readn都可以正常执行。
这是什么问题呢? |
|