Каково значение `_flag` в структуре FILE? - PullRequest
0 голосов
/ 28 июня 2018

Я работаю в отраслевом коде, где для некоторого рабочего процесса FILE* становится поврежденным. Я посмотрел на значения членов структуры и обнаружил, что _flag было присвоено, казалось бы, высокое значение ~ 33000. Это заставило меня сделать вывод, что оно испортилось.

Теперь я не уверен, что делать дальше. Может быть, знание значения _flag может помочь?

1 Ответ

0 голосов
/ 28 июня 2018

Мы не можем сказать наверняка, потому что внутренняя структура структуры FILE зависит от реализации, но поле _flag обычно является битовой маской, которую пакет stdio использует для отслеживания различных опций, которые были установлены (чтение, запись, буферизация строки и т. д.), а также различные другие биты состояния, касающиеся потока, например, касается ли он EOF.

Например, в системе, где я набираю это, <stdio.h> определяет эти значения для своего собственного поля флагов:

#define __SLBF  0x0001          /* line buffered */
#define __SNBF  0x0002          /* unbuffered */
#define __SRD   0x0004          /* OK to read */
#define __SWR   0x0008          /* OK to write */
#define __SRW   0x0010          /* open for reading & writing */
#define __SEOF  0x0020          /* found EOF */
#define __SERR  0x0040          /* found error */
#define __SMBF  0x0080          /* _buf is from malloc */
#define __SAPP  0x0100          /* fdopen()ed in append mode */
#define __SSTR  0x0200          /* this is an sprintf/snprintf string */
#define __SOPT  0x0400          /* do fseek() optimisation */
#define __SNPT  0x0800          /* do not do fseek() optimisation */
#define __SOFF  0x1000          /* set iff _offset is in fact correct */
#define __SMOD  0x2000          /* true => fgetln modified _p text */
#define __SALC  0x4000          /* allocate string space dynamically */
#define __SIGN  0x8000          /* ignore this file in _fwalk */

Таким образом, если были установлены биты __SWR, __SEOF, __SERR, __SMBF и __SIGN, значение флагов будет равно 33000. (Это довольно бессмысленная комбинация флагов, но вы получите идея.)

Суть в том, что ожидаемые значения, которые вы видели, сами по себе не предполагают, что структура FILE повреждена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...