Определить, «подключен» ли процесс к другому процессу через каналы

Благодаря напоминанию @forquare, я проверил конфигурацию oh-my-zsh и обнаружил проблему: плагин safe-paste.

После удаления safe-paste из ~/.zshrc вставка работает в режиме vi.

4
31.07.2017, 10:41
3 ответа

Чтобы проверить, направляется ли вывод программы в конвейер, на основе https://nodejs.org/api/fs.html#fs_class_fs_stats, вы хотите вызвать fs.fstat(FileDescriptor), а затем вызвать isFIFO()для возвращенного statобъекта (FIFO == first -in -first -out == канал или именованный канал):

$ </dev/null node -e 'var fs=require("fs");
   fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); });  ' 
  false
$  : | node -e 'var fs=require("fs");
   fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); });  ' 
  true

В C вы должны сделать системный вызов fstat, а затем проверить поле .st_modeвозвращенного struct statс помощью макроса S_ISFIFO.

Если вам нравится тратить циклы ЦП и вы хотите использовать внешний двоичный файл, вы можете выполнить test -p /dev/fd/$THE_FD, чтобы получить ответ (, или вызвать его в оболочке, где testбудет встроенной, или запустить statили запустить что-то другое, способное определить тип файла ).

4
27.01.2020, 20:55

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

Вам придется решить, как вызывать fstat()на выбранном вами языке программирования.В языках C или C++ функция для этого довольно проста :

.
#include <sys/types.h>  // no longer required by IEEE 1003.1:2008
#include <sys/stat.h>
#include <unistd.h>

/// \brief Check a file descriptor for being open and denoting a pipe/FIFO
extern inline
bool        /// \returns true if and only if the descriptor is open to a pipe/FIFO
is_fifo (
    int fd  ///< the file descriptor to test
) {
    struct stat s;
    return 0 <= fstat(fd, &s) && S_ISFIFO(s.st_mode);
}

Библиотека libsystemd в systemd имеет несколько более сложную sd_is_fifo()библиотечную функцию.

1
27.01.2020, 20:55

Использование Node.js во время выполнения на *nix-системе, похоже, работает:

const isTTY = process.stdout.isTTY;

если верно, то он не подключен к целевому каналу

если не определено, он подключен к целевому каналу

...по крайней мере, согласно моим исследованиям

0
27.01.2020, 20:55

Теги

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