Буфер именованных каналов после завершения процесса

  1. Узнайте, как опция globstarв bashможет вам помочь:

    shopt -s globstar ; for i in ** ; do echo "$i" ; done
    

    Это должно дать вам отсортированный список всех элементов вашего дерева каталогов, но он будет включать записи (строк )как для файлов, так и для подкаталогов -.

  2. Отфильтровать подкаталоги:

    shopt -s globstar ; for i in ** ; do [ -f " $i" ] && echo "$i" ; done
    
  3. Ввести счетчик и удалить суффиксы текущего файла:

    cnt=1
    shopt -s globstar
    for i in ** ; do
      [ -f "$i" ] && echo "${i%%.*}.$cnt"
      cnt=$((cnt=cnt+1))
    done
    
  4. Замените оператор теста echoна mvпо вашему выбору:

    mv "$i" "${i%%.*}.$cnt"
    
  5. При необходимости отключите параметр globstarпосле завершения:

    `shopt +s globstar`
    
0
25.01.2020, 23:47
1 ответ

Выполните первый вызов функции, чтобы уничтожить FIFO. Вам действительно все равно, если звонок потерпит неудачу или нет. Затем вызовитеmkfifo()(и обязательно проверьте возвращаемое значение, чтобы убедиться, что операция прошла успешно.

этот первый вызов будет unlink()Вот синтаксис:

#include <unistd.h>

   int unlink(const char *pathname);

Вот описание со страницы MAN:

unlink ()удаляет имя из файловой системы. Если бы это имя было последним ссылка на файл, и ни один процесс не открывает файл, файл удаляется и пространство, которое он использовал, становится доступным для повторного использования.

Если имя было последней ссылкой на файл, но какие-либо процессы все еще файл открыт, файл будет существовать до тех пор, пока последний файл дескриптор, ссылающийся на него, закрыт.

Если имя относится к символической ссылке, ссылка удаляется.

Если имя относится к сокету, FIFO или устройству, имя для него удалены, но процессы, у которых открыт объект, могут продолжать использовать Это.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ В случае успеха возвращается ноль. При ошибке возвращается -1, а errno установить соответствующим образом.

#include <sys/types.h>
#include <sys/stat.h>

   int mkfifo(const char *pathname, mode_t mode);

*ОПИСАНИЕ mkfifo ()создает специальный файл FIFO с именем pathname. режим указывает разрешения FIFO. Он изменяется с помощью umask процесса в обычный способ :права доступа к созданному файлу: (режим и ~umask ).

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

После того как вы таким образом создали специальный файл FIFO, любой процесс может открыть его для чтения или записи точно так же, как и обычный файл. Тем не менее, он должен быть открыт с обоих концов одновременно, прежде чем вы сможете приступить к выполнению любых операций ввода или вывода на нем. Открытие FIFO для чтение обычно блокируется до тех пор, пока какой-либо другой процесс не откроет тот же FIFO для письма и наоборот. См. fifo (7 )для неблокирующей обработки Специальные файлы FIFO.*

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ В случае успеха mkfifo ()и mkfifoat ()возвращают 0. В случае ошибки -Возвращается 1 (, и в этом случае errno устанавливается соответствующим образом ).

0
28.01.2020, 02:54

Теги

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