Выполняет ли `эхо -n |... `отправить EOF в канал?

Хорошо, я сам нашел ответ...

на самом деле намного проще в php, чем без него...

правда, мне потребовалось много часов, чтобы закончить ^^

#load the file as simplexml object and then switch into system
#https://www.w3schools.com/php/func_simplexml_load_file.asp
$xml=simplexml_load_file('./myfile') or die("Error: Cannot create object");
$xml=$xml->system

#put the whole string(s) into a variable, getname gets the name of the object itself if it exists
#https://www.w3schools.com/php/func_simplexml_getname.asp
$output='type='. $xml -> type -> static -> getName(). $xml -> type -> {'dhcp-client'} -> getName(). "\nip-address=". $xml -> {'ip-address'}. "\ndefault-gateway=". $xml -> {'default-gateway'}. "\nnetmask=". $xml -> netmask;

#write the output into a file
#https://www.w3schools.com/php/func_filesystem_file_put_contents.asp
file_put_contents('./myoutputfile', $output );

это дало мне следующий вывод для первого фрагмента (последние три строки в порядке, если они не дают значения, в противном случае я мог бы сначала проверить, существуют ли они):

type=dhcp-client
ip-address=
default-gateway=
netmask=

и этот вывод для второго фрагмента:

type=static
ip-address=192.168.0.2
default-gateway=192.168.0.1
netmask=255.255.255.0

Спасибо всем за помощь:)

4
20.09.2020, 20:25
1 ответ

Нет EOF для отправки или получения.

EOF — это просто фикция API, существующая только в библиотеке stdio. Это флаг состояния входного потока FILE*stdio, который обычно устанавливается после возврата 0системного вызова read(2)базового файлового дескриптора. И макрос для -1, который является значением, возвращаемым fgetc(3)и подобными функциями при вызове входного потока с включенным флагом EOF.

Хотя вы можете метафорически говорить об «отправке EOF» как о «косвенно заставит некоторое будущее read(2)вернуться 0», это довольно небрежно и создаст ложное впечатление, что EOF является своего рода встроенным сигналом или состояние базового файлового дескриптора или устройства, которое можно установить с другого конца.

В канале read(2)вернет 0, если

  1. буфер каналов пуст, и
  2. нет открытой рукоятки на его пишущем конце

Оба условия являются временными , что согласуется с тем, как условия EOF являются временными для обычных файлов или терминалов.

В частности, обратите внимание, что в Linux все каналы фактически именуются каналами :, пока процесс все еще имеет открытый дескриптор чтения конца канала, вы также можете восстановить его запись конца, открыв канал в режиме записи через /proc/<pid>/fd/<fd>. Хотя это может быть не так просто в других системах, наличие липкого EOF на «анонимном» канале не является частью его интерфейса.

5
18.03.2021, 23:03

Теги

Похожие вопросы