У нас есть скрипт сборки, который собирает встроенную систему для нескольких типов плат, и, когда вывод выводится в одну сторону, кажется, что он работает нормально. С другой стороны, он частично проходит через вывод, затем обрезает файл перед продолжением.
Как это работает:
time ( cd ~ ; builder.sh 2>&1 | tee ~/builder.out )
И путь, который кажется укороченным:
time ( cd ~ ; builder.sh > ~/builder.out 2>&1 )
Усечение, кажется, происходит в очень специфической точке, первая строка в файле после усечения всегда DEFAULT_INCDIRS=...
от qmake
. Тот факт, что он находится в определенной точке процесса, а не когда файл достигает определенного размера, указывает на то, что усечение не выполняет какая-то внешняя программа проверки файлов.
В любом случае, если он будет удален, скрипт продолжит запись в индекс удаленного файла до тех пор, пока он не будет закрыт, а затем удалит указанный индекс.
На самом деле происходит то, что файл кажется обрезанным, а затем запись продолжается с самого начала. Но я не знаю, как это сделать, если у программы нет доступа к дескриптору файла.
В в обоих случаях, приведенных выше, скрипт компоновщика фактически не знает о своем выходном файле, он просто записывает и выходные данные, и сообщения об ошибках в stdout
и позволяет перенаправлению оболочки позаботиться об этом.
Итак, мои вопросы таковы: есть ли способ сделать это в модели файлового ввода-вывода UNIX (скажем, из вызовов API-файлов C)? Другими словами, можете ли вы обрезать файл, в который вы пишете, когда он был настроен с помощью перенаправления? Почему вариант tee
работает? Что мешает его усечь?