我有一个问题,如果我复制我的作业可能看起来像,但这不是我的功课。它是大学考试的一部分,我想在家里解决它(以及其他人),以便我为下一次考试做好准备。 我的目标是我理解,以便我可以自己解决类似的问题。我熟悉高级语言,但C是我的弱点之一,这就是我在这里遇到问题的原因。
考虑以下方法:
int safe_read(int fd, char *buff, size_t len){
do {
errno = 0;
pos += read(fd, buff + pos, len);
if (-1 == len) {
if (ENTER != errno) {
return 0;
}
}
} while(ENTER == errno);
return pos;
}
以及以下电话:
pos = safe_read(STDIN_FILENO, msg, 225);
分析代码并回答以下问题:
1)safe-read
是否会返回在所有情况下正确读取的字节数?
2)如果没有,怎么解决?
好。目前,我已经理解了以下内容:
1) 不,它没有,原因如下:
- 调用者可能将fd设置为无效的内容。 -pos未正确初始化。 - 变量ENTER也未初始化。 -if(-1 == len)没有意义,因为len是调用者设置的参数,因此在一次调用时总是为真或假。
-it也不安全,因为它可能超出缓冲区的最大大小(通过将len设置为值> = sizeof(buff))
-it不返回在所有情况下读取的字符数,如f.e.当我第一次读len字符时,第二次它失败了。即使len字符已被读取,我也会返回零。
2)这是我的修复。 初始化变量
/ * 为了更好地理解,我写下了我对这个方法应该做什么的理解:
- 将字符读入char * buff。 - 返回读取为int的字符数 -fd是要读取的文件的文件描述符 -len是要读取的字节数
* /
int safe_read(int fd, char *buff, size_t len){
int ENTER=0;
int pos=0;
do {
errno = 0;
pos += read(fd, buff + pos, len);
if (len < 0) {
if (ENTER != errno) {
return 0;
}
}
} while(ENTER == errno);
return pos;
}
我理解正确吗?我的修正是否正确?
谢谢!
特别感谢Paul Ogilvie在我编辑之前的帮助!
答案 0 :(得分:1)
您的代码包含许多错误,其他成员想知道这是否是作业。但我会尽力帮助你。首先是你的代码:
int safe_read(int fd, char *buff, size_t len)
{
int pos= 0;
do{
errno=0;
pos+=read(fd, buff+pos, len);
if(-1==len){
if(ENTER!=errno){
return 0;
}
}
}while(ENTER==errno);
return pos;
}
变量pos
未定义,即使它是全局定义的,您可能需要将其初始化为零。
然后你的搞笑变量ENTER
,既没有定义,更重要的是,从未在你的代码中设置。所以它不会改变价值。你对这个变量的意图是什么?
然后if(-1==len)
。 len
是一个不会改变的参数,因此它不是-1或者它永远不会。显然,您想要检查读取时的错误,但这不是方法。
那么这是否安全:不,不是。假设len
的大小为buff
,那么您会反复将len
个字符附加到buff
,因此在第二次读取时,它将超出缓冲区的大小。
最后,这个函数是否总会返回正确的字符数:不,不是。假设您第一次读取len
个字符,第二次读取时失败。然后返回0
,但已读取len
个字符。