почему ftell(stdin) вызывает недопустимую ошибку поиска

Следующий код выводит «Недопустимый поиск»:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    errno = 0;
    getchar();
    getchar();
    getchar();
    ftell( stdin );
    printf( "%s\n", strerror(errno) );
}

Это происходит, когда я запускаю cat script | ./a.out, а также когда я просто запускаю ./a.out. Проблема с ftell, конечно. Мой вопрос: почему это происходит? Я думаю, что стандартный ввод можно искать. fseek также вызывает ту же ошибку. Если стандартный ввод недоступен для поиска, могу ли я сделать то же самое?

Спасибо за ваши ответы.


person Jim    schedule 23.03.2010    source источник
comment
Какую проблему вы на самом деле пытаетесь решить с помощью fseek?   -  person    schedule 23.03.2010
comment
связанные: stackoverflow.com/questions/4917801/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 17.11.2019
comment


Ответы (1)


Fifo не доступны для поиска. Они просто буфер. После того, как данные были read() из буфера FIFO, их уже нельзя будет извлечь.

Обратите внимание, что если вы запустили свою программу:

./a.out < script

тогда стандартным вводом будет файл, а не fifo, поэтому ftell() будет делать то, что вы ожидаете.

person geocar    schedule 23.03.2010
comment
+1 за пример, показывающий разницу между cat file|./a.out и ./a.out<file. - person R.. GitHub STOP HELPING ICE; 07.08.2010
comment
@R.. Какая разница? - person Calmarius; 22.09.2013
comment
@Calmarius: cat f|x использует отдельный процесс (и, возможно, отдельный процессор) для копирования файла в fifo. FIFO читается процессом x. если x делает что-то кроме read(), это может быть быстрее, чем если бы он читал сам файл. x‹f открывает f в том же процессе, что, вероятно, быстрее, если x мало что делает, кроме чтения файла, и фактически дает вам доступный для поиска файл (поскольку fifos - это просто буфер). - person geocar; 24.09.2013
comment
Стоит отметить, что ./a.out < script, вероятно, реализован с помощью freopen от Bash. - person Ciro Santilli 新疆再教育营六四事件ۍ 17.11.2019
comment
Привет @geocar, интересно, что именно вы имеете в виду, говоря здесь буфер? Fifo не доступны для поиска. Они просто буфер. . Вы имеете в виду, что в памяти находится просто массив char? - person Rick; 19.03.2020
comment
Нет, Рик, я имел в виду то, что сказал: важным свойством является то, что это недоступно для поиска, то есть вы не можете найти его с помощью lseek() или fseek() или любым другим способом поиска, потому что это не будет работать из-за того, что он не доступен для поиска. То, как ядро ​​выбирает расположение этого буфера в памяти, не имеет отношения к тому, почему этот код не работает, и размышления об этом при рассмотрении этой проблемы приведут только к глупым идеям. - person geocar; 19.03.2020