2015-03-04 4 views
1

Я просто побежал в следующее поведение и хотели бы знать причины этого:IO на файловых дескрипторов

Предположим упрощенную программу, как этот

... 
{ 
    std::ifstream in(argv[1]); 
    assert(in.good()); 
    while (std::getline(in, line)) { 
    // Area 1 
    } 
    in.close(); 
} 
{ 
    std::ifstream in(argv[1]); 
    assert(in.good()); 
    while (std::getline(in, line)) { 
    // Area 2 
    } 
    in.close(); 
} 

если такая программа вызова так:

./myProg xxx 

и, Площадь 1 и Площадь 2 будут введены в п раз, где п число строк в ххх.

Однако я при вызове как то (с использованием Баш):

./myProg <(head -n 100 xxx) 

Район 1 будет введен раз и Площадь 2 будет подставляться раз. Оба утверждения (in.good()) проходят. По-видимому, второй передает файловый дескриптор (что-то вроде/dev/fd/63, если я печатаю аргумент) вместо фактического файла, и эту вещь можно открыть для чтения один раз, но при открытии дважды он кажется пустым для второй звонок.

Интересно, в чем причина этого.

ответ

2

Процесс head выполняется один раз bash и имеет выход, перенаправленный в канал, доступ к которому через этот файл можно получить через этот файл. Ваша программа ничего не знает об этой команде head, и попытка закрыть и повторно открыть файл не приведет к ее повторному запуску.

Это похоже на ситуацию, которая была бы у вас, если ваша программа будет читать от cin, и вы выполните ее как head -n 100 xxx | ./myProg. Вы не ожидали бы, что сможете прочитать данные дважды через cin в этом сценарии. Это тоже самое.

Смежные вопросы