Определение того, является ли читаемый файл дескриптор для чтения трубы
-
30-09-2019 - |
Вопрос
Я хотел бы использовать splice
к нулю копии данных из STDIN_FILENO
к файловому дескриптору (который может быть в обычный файл, символ или блочное устройство, FIFO или что-то, что можно открыть с open
). Для того, чтобы использовать splice
, или то от Файловый дескриптор или к Файловый дескриптор должен быть подходящим концом трубы, поэтому, как правило, создается труба для служения посредником промежуточного буфера, когда программатор хочет, чтобы программист не хочет с нулевым копированием данных из не-трубы до нерубки. Однако, если STDIN_FILENO
уже прочитан конец трубы, тогда я мог бы пропустить этот шаг и попытаться напрямую спластировать STDIN_FILENO
к другому файловому дескриптору. Поэтому я хотел бы иметь возможность определить, STDIN_FILENO
это чтение трубы.
Есть ли система Linux System, которая может определить, STDIN_FILENO
это чтение трубы?
Решение
Чтобы получить информацию о открытом FD, вы можете использовать FSTAT (). Я догадаюсь, что st_mode результата должен быть s_ififo для трубы. Кроме того, / proc / self / fd / and / proc / self / fdinfo / также предоставляют некоторую информацию о дескрипторе файлов. Имейте в виду, что / proc - это специфичный Linux.
Тем не менее, я думаю, что это может быть проще просто попробовать использовать SPLICE () сначала, и если это не удается (с Einval?) Отступите к своей магии.
Другие советы
Как альтернатива, lseek()
потерпит неудачу с ESPIPE
Если «FD связан с трубой, розеткой или FIFO». Так что нет-OP lseek(fd, 0, SEEK_CUR)
скажу вам, если файловый дескриптор является любым из них.
В моей ситуации это охватывает все случаи, в которых я был заинтересован.