C синтаксис потока, не связанного ни с каким периферийным устройством - PullRequest
1 голос
/ 03 мая 2020

Я цитирую ниже второе издание C Язык программирования.

B.1 Ввод и вывод: , § 2:

A stream - это источник или назначение данных, которые могут быть связаны с диском или другим периферийным устройством.

Тогда один Можно сказать, что поток не может быть связан с каким-либо периферийным устройством: что поток может существовать без привязки к какому-либо периферийному устройству.

Поэтому возникает следующий вопрос: как выглядит поток, который не связан ни с одним периферийным устройством?

Учитывая, что авторы

B.1 Ввод и вывод: , § 3:

[...] использовать «указатель файла» и «поток» взаимозаменяемо [...]

Is

FILE *p;
p = NULL;

такой хороший ответ?

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Если «указатель файла» и «поток» действительно используются в качестве строгих синонимов, то:

FILE *fp = NULL;

определяет поток , который (еще) не связан ни с одним периферийным устройством. И при этом (пока) это не связано с каким-либо источником или назначением данных.

Если бы вы спросили Брайана Кернигана или покойного Дениса Рича ie: "Действительно ли fp там пара?", Они я бы сказал: «Ну, может, нет. Это поток, когда он использует для ввода-вывода - когда вы успешно открываете его, пока не закроете его. Это не имеет большого значения, говорите ли вы, что это поток когда он не используется, или просто указатель файла. "

Указатель файла (или поток), который используется для ввода / вывода, является программным представлением c в C некоторого источника или назначения данные. Этим источником или назначением может быть или быть подключено периферийное устройство, такое как USB-накопитель, SSD или жесткий диск, том или лента на ленте. Или это не так. Определение C не определяет и не ограничивает физическую реализацию источников или назначений данных, которые FILE * может представлять . Вот почему в книге говорится, что источник или назначение данных может быть связано с диском или другим периферийным устройством.

Стандартная библиотека C предоставляет только функцию fopen в <stdio,h> (и его укрепленном варианте fopen_s) как способ создания потока с нуля. 1 И он предоставляет хорошо известные готовые FILE * потоки stdin, stdout и stderr. Таким образом, потоки, предоставляемые <stdio.h>, обычно, но не обязательно, связаны с периферийными устройствами.

C библиотеки, отличные от стандартной библиотеки, могут предоставить вам функции, возвращающие поток FILE *, который не связан с периферийным устройством. Например, библиотека Linux C предлагает вам fmemopen и друзей, которые предоставляют FILE * I / O для областей памяти .

Вы можете даже читать или записывать FILE * потоков в память, используя только <stdio.h>. Linux позволяет легко создавать виртуальную файловую систему в памяти tmpfs. Затем вы можете писать программы исключительно в стандарте C, которые выполняют обычный FILE * ввод / вывод в вашей файловой системе tmpfs, и ни одна из них не будет связана с периферийным устройством. C не знает и не заботится о реализации файловой системы.


[1] Также есть freopen и freopen_s, которые закрывают существующий поток и открывают его снова с новым именем файла.
0 голосов
/ 03 мая 2020

Это зависит от того, как вы определяете «периферийное устройство». Существуют специальные устройства, которые не являются «периферийными устройствами» в смысле аппаратного обеспечения, подключенного к машине.

Например, /dev/null и /dev/zero - два таких устройства. Если вы открываете их (/dev/zero для чтения, /dev/null для чтения или записи), а затем связываете поток с ним, они на самом деле не взаимодействуют с периферийным устройством. То же самое можно сказать и о /dev/random и / или /dev/urandom (они доступны только для чтения).

На Linux вы можете открывать файлы в файловой системе /proc - они не связаны напрямую с периферийным устройством.

...