Когда я использовал setvbuf для изменения режима потоковой буферизации , я обнаружил, что изменение параметров [буфер] и [размер] также влияет на фактическую буферизацию потока поведение. И я не знаю, что его вызвало.
Например:
это один из моих тестовых кодов (все тесты cat myfile.txt во время сна (100))
#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 . Так что, как и следовало ожидать, мы ничего не получим, когда мы cat myfile во время сна (100).
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 ), поэтому результат отличался от этого.
Почему меньший параметр [размер] вызывает это?