Определение, является ли читаемый файловый дескриптор концом чтения канала - PullRequest
7 голосов
/ 04 сентября 2010

Я хотел бы использовать splice, чтобы обнулить данные из STDIN_FILENO в дескриптор файла (который может быть обычным файлом, символом или блочным устройством, FIFO или чем-либо, что можетбыть открыт с open).Чтобы использовать splice, либо дескриптор файла из , либо дескриптор файла от до должен быть соответствующим концом канала, поэтому обычно канал создается для использования в качестве промежуточного буфера.когда программист хочет скопировать данные из не-канала в не-канал.Однако, если STDIN_FILENO уже конец чтения канала, то я мог бы пропустить этот шаг и попытаться соединить непосредственно из STDIN_FILENO с другим дескриптором файла.Поэтому я хотел бы иметь возможность определить, является ли STDIN_FILENO концом чтения канала.

Существует ли системный вызов Linux, который может определить, является ли STDIN_FILENO концом чтения канала?

Ответы [ 2 ]

8 голосов
/ 04 сентября 2010

Чтобы получить информацию об открытом fd, вы можете использовать fstat ().Я предполагаю, что st_mode результата должен быть S_IFIFO для канала.Кроме того, / proc / self / fd / и / proc / self / fdinfo / также предоставляют некоторую информацию о дескрипторе файла.Имейте в виду, что / proc специфичен для linux.

Однако я думаю, что было бы проще просто сначала попытаться использовать splice (), и в случае неудачи (с EINVAL?) Вернуться к своей магии.

1 голос
/ 28 февраля 2015

В качестве альтернативы lseek() завершится с ESPIPE, если «fd связан с каналом, сокетом или FIFO».Поэтому неоператор lseek(fd, 0, SEEK_CUR) скажет вам, является ли дескриптор файла любым из них.

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

...