Если я создаю канал в unix следующим образом:
int fds[] = {0, 0};
pipe(fds);
Затем сделайте FILE *
из fds[0]
следующим образом:
FILE *pipe_read = fdopen(fds[0], "rt");
Затем как закрыть этот файл (pipe_read
)?
fclose(pipe_read)
pclose(pipe_read)
close(fileno(pipe_read))
fdopen
возвращает a FILE*
, поэтому вы должны fclose
его. Это также закроет базовый файловый дескриптор.
Вызов pclose
предназначен для закрытия дескриптора, созданного с помощью popen
, функции, которую вы используете для запуска команды и подключения к ней с помощью труб.
Вызов close
закроет базовый файловый дескриптор, но, к сожалению, до того, как дескриптор файла имел возможность сбросить свои данные, другими словами, вы, вероятно, потеряете данные.
Вы должны использовать fclose (pipe_read).
close() закрывает файловый дескриптор в ядре. Этого недостаточно, потому что указатель файла не является бесплатным. Поэтому вы должны использовать fclose() на pipe_read, который также позаботится о закрытии дескриптора файла.
man popen
дает вам информацию в строке 3