较小的参数会影响setvbuf结果吗?

时间:2019-04-13 09:00:56

标签: c io stream buffer

当我使用setvbuf更改流缓冲模式时,我发现更改 [buffer] [size] 参数也影响了实际的流缓冲行为。我不知道是什么原因造成的。

例如:

这是我的测试代码之一(所有测试都是在睡眠(100)期间 cat myfile.txt

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main ()
{
  FILE *pFile;
  char *buf = (char *)malloc(20);
  char *str = "abcde";
  pFile=fopen ("myfile.txt","w");
  setvbuf (pFile,buf,_IOLBF,20); //change [buffer] and [size] parameter will get unexpected behavior. 
  fwrite(str,sizeof(char),strlen(str),pFile);
  sleep(100);
  fclose (pFile);
  return 0;
}

这里的缓冲模式设置为 _IOLBF 。因此,正如预期的那样,当我们在睡眠(100)期间 cat myfile 时,我们什么也不会得到。

XXX@Ubuntu:~$ cat myfile.txt abcde

然后我得到了这个奇怪的结果。之后,我尝试了许多不同的组合并获得了以下结果。

+ [stream] + [buffer]  +   [mode]  +   [size]   +   behave as [mode]
|          |           |           |            |
+-------------------------------------------------------------------+
|  pFile   |    buf    |   _IOLBUF |    20      |       ×
|  pFile   |    buf    |   _IOLBUF |    200     |       √
|  pFile   |    NULL   |   _IOLBUF |    20      |       √
|  pFile   |    NULL   |   _IOLBUF |    200     |       √
|  pFile   |    buf    |   _IOFBUF |    20      |       ×
|  pFile   |    buf    |   _IOFBUF |    200     |       √
|  pFile   |    NULL   |   _IOFBUF |    20      |       √
|  pFile   |    NULL   |   _IOFBUF |    200     |       √
|          |           |           |            |

最后,发现[size]太小(但仍大于 str 的长度),因此结果与此不同。

为什么较小的参数[size]会导致这种情况?

0 个答案:

没有答案