当我使用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]会导致这种情况?