Что делает truncate с файлом
Я написал ответ на этот вопрос по ошибке в ответ на вопрос о разнице между DROP и TRUNCATE , но я подумал, что стыдно не делиться, поэтому я отправлю свой собственный ответ на свой вопрос . это вообще этично? :)
Edit: если ваш ответ специфичен для платформы, вы можете указать это.
вот список различий. Я выделил специфические для Oracle функции, и, надеюсь, сообщество также может добавить конкретную разницу других поставщиков. Различия, общие для большинства поставщиков, могут находиться непосредственно под заголовками, при этом различия выделены ниже.
Если вы хотите быстро удалить все строки из таблицы, и вы действительно уверены, что хотите это сделать, и у вас нет внешних ключей против таблиц, то усечение, вероятно, будет быстрее, чем удаление.
различные системные проблемы должны быть рассмотрены, как подробно описано ниже.
Delete - это DML, Truncate-DDL
переменная по поставщику
SQL * Server
усечение можно свернуть спина.
PostgreSQL
усечение можно откатить.
Oracle
поскольку усечение является DDL, оно включает в себя два коммита, один до и один после выполнения оператора. Поэтому Truncate нельзя откатить, и сбой в процессе усечения все равно выдаст фиксацию.
однако, см. Flashback ниже.
Delete не восстанавливает пространство, усечение восстанавливает пространство
Oracle
Если вы используете предложение REUSE STORAGE, сегменты данных не освобождаются, что может быть несколько более эффективным, если таблица должна быть перезагружена данными. Отметка прилива сбрасывается.
Delete можно использовать для удаления всех строк или только подмножества строк. Инструкция truncate удаляет все строки.
Oracle
когда таблица секционирована, отдельные разделы могут быть усечены изолированно, таким образом, возможно частичное удаление всех данных таблицы.
Delete можно применить к таблицам и таблицам внутри кластера. Усечение применяется только к таблицам или ко всему кластеру. (Может быть специфичным для Oracle)
Oracle
Delete не влияет на идентификатор объекта данных, но truncate назначает новый идентификатор объекта данных если никогда не было вставки против таблицы с момента ее создания, даже одна вставка, которая откатывается, приведет к назначению нового идентификатора объекта данных при усечении.
Flashback работает через удаления, но усечение предотвращает flashback к государства до операции.
однако из 11gR2 функция архивирования FLASHBACK позволяет это, за исключением Express Edition
Oracle
Delete может быть предоставлен в таблице другому пользователю или роль, но усечение не может быть без использования DROP любого табличного гранта.
Delete генерирует небольшое количество повтора и большое количество отмены. Truncate генерирует незначительное количество каждого.
Oracle
операция усечения делает неиспользуемые индексы снова пригодными для использования. Удалить - нет.
усечение не может быть применено, когда включенный внешний ключ ссылается на таблицу. Обработка delete зависит от конфигурации внешних ключей.
Oracle
усечение требует исключительной блокировки таблицы, удаление требует общей блокировки таблицы. Следовательно, отключение блокировок таблиц-это способ предотвращения операций усечения на таблица.
триггеры DML не срабатывают при усечении.
Oracle
триггеры DDL доступны.
Oracle
усечение не может быть выдано по ссылке базы данных.
SQL * Server
Truncate сбрасывает последовательность для типов столбцов идентификаторов, delete - нет.
в большинстве реализаций a DELETE оператор может вернуть клиенту строки, которые были удалены.
например, в подпрограмме Oracle PL / SQL вы можете:
разница между усечением и удалением указана ниже:
команда DROP удаляет таблицу из базы данных. Все строки, индексы и привилегии таблиц также будут удалены. Триггеры DML не будут запущены. Откат операции невозможен.
усечь
TRUNCATE удаляет все строки из таблицы. Операция не может быть откат и никакие триггеры не будут запущены. Таким образом, TRUCATE быстрее и не использует столько пространства отмены, сколько удаления.
удалить
команда DELETE используется для удаления строк из таблицы. Предложение WHERE может использоваться только для удаления некоторых строк. Если условие WHERE не указано, все строки будут удалены. После выполнения операции удаления необходимо зафиксировать или откатить транзакцию, чтобы сделать изменение постоянным или отменить его. Обратите внимание, что эта операция вызовет срабатывание всех триггеров удаления в таблице.
все хорошие ответы, к которым я должен добавить:
С TRUNCATE TABLE является DDL (Язык Дефинации Данных), а не DML (Манипуляция Данными Langauge команды), то Delete Triggers не работают.
с SQL Server или MySQL, если есть ПК с автоматическим приращением, truncate сбросит счетчик.
" усечение ничего не регистрирует " правильно. Я бы пошел дальше:
усечение не выполняется в контексте транзакции.
преимущество скорости усечения над удалением должно быть очевидным. Это преимущество варьируется от тривиального до огромного, в зависимости от вашей ситуации.
однако я видел, как усечение непреднамеренно нарушает ссылочную целостность и нарушает другие ограничения. Сила, которую вы получаете, изменяя данные вне транзакции, имеет быть сбалансированным с ответственностью, которую вы наследуете, когда идете по канату без сети.
да, удаление медленнее, усечение быстрее. Почему?
DELETE должен прочитать записи, проверить ограничения, обновить блок, обновить индексы и создать повтор / отменить. Все это требует времени.
усечение просто настраивает указатель в базе данных для таблицы (высокая отметка воды) и пуф! данные исчезли.
Это специфический Oracle, AFAIK.
Если случайно вы удалили все данные из таблицы с помощью Delete / Truncate. Можно откатить зафиксированную транзакцию. Восстановите последнюю резервную копию и запустите журнал транзакций до момента, когда произойдет удаление/усечение.
соответствующая информация ниже находится от блоге:
- Delete-это команда DML.
- инструкция Delete выполняется с помощью блокировки строк, каждая строка в таблице блокируется для удаления.
- мы можем указать фильтры в предложении where.
- он удаляет указанные данные, если существует условие.
- удалить действия триггера, поскольку операция регистрируется отдельно.
- медленнее, чем Усечь, потому что он хранит журналы
- усечение-это команда DDL.
- усеченная таблица всегда блокирует таблицу и страницу, но не каждую строку.Как он удаляет все данные.
- невозможно использовать условие Where.
- он удаляет все данные.
- Truncate table не может активировать триггер, поскольку операция не регистрирует отдельные удаления строк.
- быстрее в исполнении мудро, потому что он не ведет никаких журналов.
Если случайно вы удалили все данные из таблицы, используя Удалить / Усечь. Можно откатить зафиксированную транзакцию. Восстановить последнее резервное копирование и запуск журнала транзакций до момента удаления / усечения вот-вот произойдет.
TRUNCATE является оператором DDL, тогда как DELETE является оператором DML. Ниже приведены различия между ними:
As TRUNCATE является DDL (язык определения данных) заявление, она не требует фиксации, чтобы сделать изменения постоянными. И именно по этой причине строки, удаленные truncate, не могут быть откатаны. С другой стороны!--1--> является DML (язык манипулирования данными) оператор, следовательно, требует явной фиксации чтобы сделать эффект постоянным.
TRUNCATE всегда удаляет все строки из таблицы, оставляя таблицу пустой и структуру таблицы неповрежденной, тогда как DELETE может удалить условно, если используется предложение where.
строки удалены TRUNCATE TABLE оператор не может быть восстановлен, и вы не можете указать предложение where в TRUNCATE заявление.
здесь - это очень хорошая ссылка отношение к теме.
- это быстрее и использует меньше ресурсов системы и журналов транзакций, чем DELETE .
- удаляет данные путем освобождения страниц данных, используемых для хранения данных таблицы, и только освобождение страниц записывается в журнал транзакций.
- удаляет все строки из таблицы, но структуру таблицы, столбцы, ограничения, индексы и так далее, остается. Счетчик используется удостоверение сбрасывается в начальное колонна.
- вы не можете использовать TRUNCATE TABLE в таблице, на которую ссылается FOREIGN KEY ограничения. Потому что TRUNCATE TABLE не регистрируется, он не может активировать триггер.
- не может быть откат.
- это команда DDL.
- сбрасывает идентификатор таблицы
- удаляет строки по одной и записывает запись в журнал транзакций для каждой удаленной строки.
- если вы хотите сохранить идентичность счетчик, используйте . Если вы хотите удалить определение таблицы и данные, используйте DROP TABLE заявление.
- можно использовать С или без WHERE п.
- активирует триггеры.
- может быть откат.
- это команда DML.
- не сбрасывает идентификатор таблицы.
Примечание: DELETE и TRUNCATE оба могут быть откатаны, когда окружены TRANSACTION если текущая сессия не закрыта. Если TRUNCATE написано в Редакторе запросов в окружении TRANSACTION и если сеанс закрыт, его нельзя откатить, но DELETE можно откатить назад.
в SQL Server 2005 я считаю, что вы can откат усечения
удалить
команда DELETE используется для удаления строк из таблицы. Предложение WHERE может использоваться только для удаления некоторых строк. Если условие WHERE не указано, все строки будут удалены. После выполнения операции удаления необходимо зафиксировать или откатить транзакцию, чтобы сделать изменение постоянным или отменить его. Обратите внимание, что эта операция вызовет срабатывание всех триггеров удаления в таблице.
усечь
усечение удаляет все строки из таблицы. Операция не может быть откат и никакие триггеры не будут запущены. Таким образом, TRUCATE быстрее и не использует столько пространства отмены, сколько удаления.
команда DROP удаляет таблицу из базы данных. Все строки, индексы и привилегии таблиц также будут удалены. Триггеры DML не будут запущены. Откат операции невозможен.
DROP и TRUNCATE-это команды DDL, тогда как DELETE-это команда DML. Поэтому операции удаления можно откатить (отменить), а операции удаления и усечения нельзя откатить.
небольшая поправка к исходному ответу-delete также генерирует значительное количество повторов (поскольку undo сам защищен повтором). Это видно из вывода autotrace:
усечение можно откатить, если обернуть транзакцию.
пожалуйста, посмотрите две ссылки ниже, и проверьте себя:-
усечение против удаления является одним из печально известные вопросы во время интервью SQL. Просто убедитесь, что вы правильно объясните интервьюеру, или это может стоить вам работы. Проблема в том, что не многие знают, поэтому, скорее всего, они сочтут ответ неправильным, если вы скажете им, что да усечение может быть откат.
самая большая разница заключается в том, что усечение не регистрируется, а удаление.
просто это означает, что в случае сбоя базы данных вы не можете восстановить данные, управляемые truncate, но с delete вы можете.
более подробная информация здесь
инструкция DELETE: эта команда удаляет только строки из таблицы на основе условия, указанного в предложении where, или удаляет все строки из таблицы, если условие не указано. Но это не освобождает пространство, содержащее таблицу.
синтаксис инструкции SQL DELETE:
удалить из table_name [где условие];
инструкция TRUNCATE: эта команда используется для удаления всех строк из таблицы и освобождения пространства, содержащего таблица.
удалить
усечь
для получения более подробной информации посетите
еще одно отличие двух операций заключается в том, что если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается на 1 (или на начальное значение, определенное для столбца) в разделе усечение. DELETE не влияет на это.
• Удалить Данные: во-первых, сначала оба могут быть использованы для удаления строк из таблицы.
Но DELETE может использоваться для удаления строк не только из таблицы, но и из представления или результата OPENROWSET или OPENQUERY в зависимости от возможностей поставщика.
• из п.: С DELETE вы также можете удалить строки из одна таблица / представление / rowset_function_limited на основе строк из другой таблицы с помощью другого предложения FROM. В этом предложении FROM вы также можете написать нормальные условия соединения. Фактически вы можете создать инструкцию DELETE из инструкции SELECT, которая не содержит агрегатных функций, заменив SELECT на DELETE и удалив имена столбцов.
С TRUNCATE вы не можете этого сделать.
• здесь: усечение не может иметь условий WHERE, но удаление может. Те средства с помощью TRUNCATE вы не можете удалить определенную строку или определенную группу строк. Усечение таблицы аналогично инструкции DELETE без предложения WHERE.
• производительность: усечение таблицы быстрее и использует меньше ресурсов системы и журнала транзакций. И одна из причин-блокировки, используемые в обоих операторах. Инструкция DELETE выполняется с помощью блокировки строк, каждая строка в таблице блокируется для удаления. Усеченная таблица всегда блокирует таблицу и страницу, но не каждую ряд.
• журнал операций : инструкция DELETE удаляет строки по одной и делает отдельные записи в журнале транзакций для каждой строки.
TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только освобождение страниц в журнал транзакций.
• страницы : после выполнения инструкции DELETE таблица все еще может содержать пустые страницы. TRUNCATE удаляет данные освобождение страниц данных, используемых для хранения данных таблицы.
• триггер: TRUNCATE не активирует триггеры удаления в таблице. Поэтому вы должны быть очень осторожны при использовании TRUNCATE. Никогда не следует использовать усечение, если триггер delete определен в таблице для автоматической очистки или ведения журнала при удалении строк.
• Столбец Identity : С усечением если таблица содержит столбец идентификатора, счетчик для этого столбец сбрасывается до начального значения, определенного для столбца. Если семя не определено, используется значение по умолчанию 1. DELETE не сбрасывает счетчик идентификаторов. Поэтому, если вы хотите сохранить счетчик идентификаторов, используйте вместо этого DELETE.
• репликация : DELETE можно использовать против таблицы, используемой в репликации транзакций или репликации слиянием.
Хотя усечение нельзя использовать для таблиц, участвующих в репликации транзакций или репликации слиянием.
• откат : оператор DELETE может быть откат.
Усечение также можно откатить, если оно заключено в блок транзакций и сеанс не закрыт. После закрытия сеанса вы не сможете откатить усечение.
• ограничения : оператор DELETE может завершиться ошибкой, если он нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице с ограничением внешнего ключа. Если удалить удаляет несколько строки, и любая из удаленных строк нарушает триггер или ограничение, инструкция отменяется, возвращается ошибка и строки не удаляются.
И если DELETE используется против представления, это представление должно быть обновляемым представлением. Усечение не может использоваться против таблицы, используемой в индексированном представлении.
Усечение не может использоваться против таблицы, на которую ссылается ограничение внешнего ключа, если только таблица не имеет внешнего ключа, ссылающегося на себя.
короче говоря, усечение ничего не регистрирует (так намного быстрее, но не может быть отменено), тогда как delete регистрируется (и может быть частью большей транзакции, будет откат и т. д.). Если у вас есть данные, которые вы не хотите в таблице в dev, обычно лучше усечь, поскольку вы не рискуете заполнить журнал транзакций
большая причина, по которой это удобно,-это когда вам нужно обновить данные в многомиллионной таблице строк, но не хотите ее перестраивать. "Исключить *" займет вечность, в то время как влияние усечения на производительность будет незначительным.
У меня есть несколько таблиц, которые я строю, как часть моего сводного отчета. Потом они мне совсем не нужны. Кто-то упомянул, чтобы обрезать их, так как это будет быстрее.
удаление записей из таблицы регистрирует каждое удаление и выполняет триггеры удаления для удаленных записей. Усечение-это более мощная команда, которая очищает таблицу без регистрации каждой строки. SQL Server запрещает усечение таблицы с внешними ключами, ссылающимися на нее, из-за необходимости проверки внешних ключей в каждой строке.
усечение обычно сверхбыстрое, идеально подходит для очистки данных из временной таблицы. Он сохраняет структуру таблицы на будущее использовать.
Если вы действительно хотите удалить таблицу определения а также данные, просто перетащите таблицы.
посмотреть эта статья MSDN дополнительная информация
DROP TABLE удаляет таблицу.
усеченная таблица опустошает ее, но оставляет ее структуру для будущих данных.
DROP и TRUNC делают разные вещи:
УСЕЧЬ ТАБЛИЦУ
удаляет все строки из таблицы без записывая в журнал удаление отдельных строк. Усеченная таблица подобна Оператор DELETE без предложения WHERE; тем не менее, усеченная таблица быстрее и использует меньше системы и журнала транзакций ресурсы.
DROP TABLE
удаляет одно или несколько определений таблиц и все данные, индексы, триггеры, ограничения и разрешения спецификации для этих таблиц.
Что касается скорости разница должна быть небольшой. И в любом случае, если вам вообще не нужна структура таблицы, обязательно используйте DROP.
Я думаю, что вы имеете в виду разницу между DELETE TABLE и TRUNCATE TABLE.
DROP TABLE
удалить таблицу из базы данных.
УДАЛИТЬ ТАБЛИЦУ
без условия удалить все строки. Если есть триггер и ссылки, то это будет процесс для каждой строки. Также индекс будет изменен, если он есть.
УСЕЧЬ ТАБЛИЦУ
установите количество строк равным нулю и без регистрации каждой строки. Что он намного быстрее, чем другие оба.
обычно, если я хочу избавиться от большого стола, я удалит его, потом бросьте его. Таким образом, данные будут уничтожены без записи, и таблицу можно будет удалить, и это падение будет очень недорогим, потому что нет необходимости записывать данные.
важно отметить, что усечение просто удаляет данные, оставляя таблицу, в то время как drop будет фактически удалять данные и саму таблицу. (предполагая, что внешние ключи не исключают такого действия)
усеченная таблица сохраняет все ваши старые индексации и прочее. DROP TABLE, очевидно, избавится от таблицы и потребует от вас воссоздать ее позже.
Drop полностью избавляется от таблицы, удаляя определение. Truncate опустошает таблицу, но не избавляется от определения.
усек стол пустеет стол. Удаление таблицы полностью удаляет ее. Любой из них будет быстрым, но его удаление, скорее всего, будет быстрее (в зависимости от вашего ядра СУБД).
Если он вам больше не нужен, отбросьте его, чтобы он не загромождал вашу схему.
удалить таблицы tablea вместо truncate таблицы tablea? Распространенное заблуждение состоит в том, что они делают то же самое. Не так. На самом деле между ними существует много различий.
DELETE-это регистрируемая операция для каждой строки. Это средство что удаление каждой строки регистрируется и физически удаляется.
вы можете удалить любую строку, которая не будет нарушать ограничение, оставляя внешний ключ или любое другое противопоказание на месте.
TRUNCATE также регистрируется операция, но по-другому. TRUNCATE регистрирует освобождение страниц данных, в которых данные существует. Освобождение страниц данных означает, что ваши данные строки все еще существуют на страницах данных, но экстенты помечены как пустые для повторного использования. Это делает усечь быстрее операцию по удаление.
нельзя усечь таблицу с внешним ключом ограничения. Вам придется убрать противопоказания, обрезать стол и заново контрсилой.
усечь сбросит столбцы идентификаторов семени по умолчанию значение.
truncate удаляет все строки, но не саму таблицу, это по существу эквивалентно удалению без предложения where, но обычно быстрее.
У меня есть исправление для одного из заявлений выше. "усечение не может быть откатано"
усечение можно откатить. В некоторых случаях нельзя выполнить усечение или удаление таблицы, например при наличии ссылки на внешний ключ. Для такой задачи, как ежемесячная отчетность, я, вероятно, просто отброшу таблицу, когда она мне больше не понадобится. Если бы я делал этот сводный отчет чаще, я бы, вероятно, сохранил таблицу и использовал truncate.
надеюсь, что это помогает, вот еще информация, которую вы должны найти полезной.
Главное меню » Linux » Как использовать команду Truncate в Linux
Усеченный размер зависит от исходного размера файла; дополнительные данные будут потеряны, если размер файла больше указанного.
Начнем с разных примеров, чтобы увидеть, как можно уменьшить размер файла.
Установка пакетов Coreutils
Команда truncate входит в состав большинства дистрибутивов Linux. Если его нет, его также можно установить с помощью приведенной ниже команды:
Используйте команду grep, чтобы просмотреть подробную информацию о пакетах:
Как использовать команду «Truncate»?
Синтаксис усечения файлов с перенаправлением:
«:» Двоеточие означает истинны и не имеет выхода и оператор перенаправления «>» перенаправляет вывод в конкретный файл.
Файл, который мы усекаем, называется test.sh:
Другой способ обрезать файл:
Он удаляет содержимое файла «test.sh».
Очистить содержимое файла
Используйте параметр «-s», чтобы удалить содержимое файлов. Это предпочтительный способ удалить файл вручную. Команда truncate эффективно удаляет все содержимое файла. Она не удаляет файл, а оставляет его как файл с нулевым байтом на диске.
Давайте используем усечение, чтобы очистить file.txt до 0 байтов:
Если вы воспользуетесь командой усечения, права доступа к файлу и право собственности на него сохранятся.
Используйте команду «ls -lh», чтобы подтвердить размер:
Усечение файла до определенного размера
Для создания файла используйте:
Чтобы подтвердить права доступа и размер файла, используйте:
Урежем файл до размера 100 байт:
Для подтверждения размера используйте:
Чтобы уменьшить размер файла до 300 КБ:
Введите указанную ниже команду, чтобы проверить размер:
Увеличение размера файла
Вы можете увеличить размер файла, используя «+» с опцией «-s».
Мы бы хотели увеличить размер файла с 300 кб до 600 кб:
Размер файла увеличен с 300 кбдо 600 кб. Проверьте размер:
Уменьшение размера файла
Получать помощь
Проверка версии
Чтобы проверить версию команды truncate, используйте:
Заключение:
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
ОБЗОР
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* начиная с glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
ОПИСАНИЕ
Функции truncate() и ftruncate() обрезают обычный файл, указанный по имени path или ссылке fd, до размера, указанного в length (в байтах).Если до этого файл был больше указанного размера, все лишние данные будут утеряны. Если файл был меньше, он будет увеличен, а дополнительная часть будет заполнена нулевыми байтами («\0»).
Смещение файла не изменяется.
Если размер изменился, поля st_ctime и st_mtime (время последнего изменения состояния и время последнего изменения, соответственно; смотрите stat(2)) файла будут обновлены, а биты режимов set-user-ID и set-group-ID могут быть сброшены.
Для ftruncate() файл должен быть открыт на запись; для truncate() файл должен быть доступен на запись.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.ОШИБКИ
Для truncate(): EACCES В одном из каталогов префикса не разрешен поиск, либо указанный файл не доступен на запись для пользователя (смотрите также path_resolution(7)). EFAULT Значение path указывает за пределы адресного пространства, выделенного процессу. EFBIG Аргумент length больше максимально допустимого размера файла (XSI). EINTR При блокирующем ожидании завершения вызов был прерван обработчиком сигналов; смотрите fcntl(2) и signal(7). EINVAL Аргумент length является отрицательным или больше максимально допустимого размера файла. EIO Во время обновления индексного дескриптора (inode) возникла ошибка ввода/вывода. EISDIR Указанный файл является каталогом. ELOOP Во время определения pathname встретилось слишком много символьных ссылок. ENAMETOOLONG Компонент имени пути содержит более 255 символов, или весь путь содержит более 1023 символов. ENOENT Указанный файл не существует. ENOTDIR Компонент в префиксе пути не является каталогом. EPERM Используемая файловая система не поддерживает расширение файла больше его текущего размера. EPERM Выполнение операции предотвращено опечатыванием (file seal); смотрите fcntl(2). EROFS Указанный файл находится на файловой системе, смонтированной только для чтения. ETXTBSY Файл является исполняемым файлом, который в данный момент исполняется.Для ftruncate() действуют те же ошибки, за исключением того, что вместо ошибок, связанных с неправильным path, появляются ошибки, связанные с файловым дескриптором fd:
EBADF Значение fd не является правильным файловым дескриптором. EBADF или EINVAL Дескриптор fd не открыт для записи. EINVAL Дескриптор fd не указывает на обычный файл. EINVAL или EBADF Файловый дескриптор fd не открыт на запись. В POSIX это допускается и переносимые приложения должны обрабатывать любую ошибку для этого случая (Linux возвращает EINVAL).
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (данные вызовы впервые появились в 4.2BSD).ЗАМЕЧАНИЯ
В ОПИСАНИИ приведена информация для XSI-совместимых систем. Для не XSI-совместимых систем в стандарте POSIX описано два поведения ftruncate(), когда length превышает длину файла (заметим, что truncate() не обязательно быть во всех таких окружениях): или вернуть ошибку, или расширить файл. Подобно большинству реализаций UNIX, Linux соответствует требованию XSI, когда работает с родными файловыми системами. Однако, в некоторых неродных файловых системах не разрешается использовать truncate() и ftruncate() для расширения файла больше его текущей длины: например, в Linux это касается VFAT.Первоначальные версии системных вызовов truncate() и ftruncate() в Linux не умели работать с большими файловыми смещениями. Позднее, в Linux 2.4 были добавлены системные вызовы truncate64() и ftruncate64() для работы с большими файлами. Однако это различие может игнорироваться приложениями, которые используют glibc, так как имеющиеся в ней обёрточные функции самостоятельно задействуют более новый системный вызов, если он доступен.
На некоторых 32-битных архитектурах интерфейс этих системных вызовов отличается от описанного выше по причинам, указанным в syscall(2).
Читайте также: