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

StackOverflow https://stackoverflow.com/questions/3639454

Вопрос

Я хотел бы использовать 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) скажу вам, если файловый дескриптор является любым из них.

В моей ситуации это охватывает все случаи, в которых я был заинтересован.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top