Именованные каналы, дескрипторы файлов и EOF

Вам необходимо загрузиться с Linux Live USB (желательно mint или ubuntu), убедиться, что раздел жесткого диска linux смонтирован для чтения / записи, и использовать linux mv , чтобы переместить каталог в нужное место.

Я бы подошел следующим образом:

  1. Загрузите вашу систему с Linux Live USB.
  2. Воспользуйтесь файловым менеджером в операционной системе Linux, чтобы найти раздел Linux Mint на жестком диске с вашим каталогом / home на нем.
  3. Откройте командный терминал в живой системе Linux. (например, "перейти в оболочку ", хех)
  4. Введите команду mount , которая покажет вам список дисков и каталоги, в которые они смонтированы в системе live linux, например:

     ...
     / dev / sda3 on / media / aaa (ro) 
     / dev / sda4 on / mnt / a3d2fe6 (ro) 
     ... 
     
  5. Узнайте, какой каталог (путь после «on» в приведенных выше выходных данных) является вашим разделом Linux Mint. Вам нужно смотреть только на те строки, которые начинаются с «/ dev /». Для каждого каталога выполните

     ls  / home 
     

    , заменив

    именем каталога. Не проверяйте «/», это корневой каталог действующей системы USB.

  6. Когда вы узнаете, какой смонтированный каталог содержит ваш домашний каталог, введите эти команды, заменив "/ yourdirectory" на каталог, который вы указали в выходных данных команды mount :

     sudo mount - o remount, rw / yourdirectory 
    cd / yourdirectory 
    sudo mv home / etc и т. д. 
     
10
19.06.2018, 22:46
2 ответа

Это связано с закрытием файлового дескриптора.

В вашем первом примере echoзаписывает в свой стандартный поток вывода, который оболочка открывает, чтобы соединить его с f, и когда он завершается, его дескриптор закрывается (оболочкой ). На принимающей стороне оболочка, которая считывает ввод из своего стандартного потока ввода (, подключенного к f), считывает ls, запускает ls, а затем завершает работу из-за конца -условия файла -на его стандартный ввод.

Состояние конца -из -файла возникает из-за того, что все средства записи в именованный канал (и только один в этом примере )закрыли свой конец канала.

Во втором примере exec 3>fоткрывает файловый дескриптор 3 для записи в f, затем echoзаписывает в него ls. Теперь файловый дескриптор открыт в оболочке, а не в команде echo. Дескриптор остается открытым, пока вы не выполните exec 3>&-. На принимающей стороне оболочка, которая считывает ввод из своего стандартного потока ввода (, подключенного к f), считывает ls, запускает ls, а затем ожидает ввода дополнительных данных (, поскольку поток все еще открыт ). ].

Поток остается открытым, так как все пишущие в него (оболочка через exec 3>fиecho)не закрыли свой конец канала(exec 3>fпо-прежнему действует ).


Я написал о echoвыше, как если бы это была внешняя команда. Скорее всего он встроен в оболочку. Тем не менее эффект тот же.

13
27.01.2020, 20:00

Прочитав два ответа от @Kusalananda и @ikkachu, кажется, я понял. В окне -1 оболочка ожидает чего-то, чтобы одновременно открыть конец записи канала и затем закрыть его. Как только конец записи открыт, оболочка в окне -1 печатает приглашение. Как только конец записи закрывается, оболочка получает EOF и умирает.

На стороне окна -2 у нас есть две ситуации, описанные в моем вопросе :в первой ситуации с echo ls > f, нет файлового дескриптора 3, поэтому у нас есть echoнерест, и его stdinи stdoutвыглядят так:

0 --> tty
1 --> f

Затем echoзавершается, и оболочка закрывает оба дескриптора. Поскольку файловый дескриптор 1 закрыт и ссылается на f, конец записи fзакрывается, и это приводит к EOF для окна -1.

Во второй ситуации мы запускаем exec 3>fв нашей оболочке, заставляя оболочку принять эту среду:

bash:
0 --> tty
1 --> tty
2 --> tty
3 --> f

Теперь мы запускаем echo ls >& 3, и оболочка выделяет файловые дескрипторы для echoследующим образом:

echo:
0 --> tty
1 --> f     # because 3 points to f
2 --> tty

Затем оболочка закрывает три приведенных выше дескриптора, включая f, но fпо-прежнему имеет ссылку на него из самой оболочки. Это важное отличие. Закрытие дескриптора 3 с помощью exec 3>&-закроет последнюю открытую ссылку и вызовет EOF для окна -1, как отметил @Kusalananda.

3
27.01.2020, 20:00

Теги

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