параметры меньшего размера влияют на результаты setvbuf? - PullRequest
0 голосов
/ 13 апреля 2019

Когда я использовал 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 ), поэтому результат отличался от этого.

Почему меньший параметр [размер] вызывает это?

...