| truncate(2) | System Calls Manual | truncate(2) |
truncate, ftruncate - ustawia długość pliku
Standardowa biblioteka C (libc, -lc)
#include <unistd.h>
int truncate(const char *path, off_t length); int ftruncate(int fd, off_t length);
truncate():
_XOPEN_SOURCE >= 500
|| /* Od glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| /* glibc <= 2.19: */ _BSD_SOURCE
ftruncate():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
|| /* glibc <= 2.19: */ _BSD_SOURCE
Funkcje truncate() i ftruncate() powodują, że zwykły plik nazwany za pomocą path lub do którego odnosi się fd, jest docinany do długości dokładnie length bajtów.
Jeśli plik był wcześniej większy od tego rozmiaru, dodatkowe dane są tracone. Jeśli plik był wcześniej mniejszy, jest powiększany, a odczyt z nowej części zwróci bajty null („\0”).
Przesunięcie pliku nie ulega zmianie.
Jeśli rozmiar pliku się zmieni, aktualizowane są pola st_ctime i st_mtime pliku (odpowiednio: czas ostatniej zmiany statusu i czas ostatniej modyfikacji; zob. inode(7)), a bity trybu set-user-ID i set-group-ID mogą być wyczyszczone.
Przy ftruncate(), plik musi być otwarty do odczytu; przy truncate(), plik musi być zapisywalny.
Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane errno, wskazując błąd.
Dla truncate():
W przypadku ftruncate() stosują się te same błędy, lecz zamiast nieprawidłowości dotyczących ścieżki path, tu błędy będą dotyczyć deskryptora pliku fd:
Detale w OPISIE dotyczą systemów zgodnych z XSI. W systemach, które nie są zgodne z XSI, standard POSIX zezwala na dwa typy zachowań w przypadku ftruncate(), gdy length przekracza długość pliku (proszę zauważyć, że truncate() w ogóle nie jest wspomniane w takim środowisku): albo zwrócenie błędu, albo zwiększenie pliku. Podobnie jak większość implementacji Uniksa, Linux podąża za wymaganiem XSI na natywnych systemach plików. Jednak niektóre nierodzime systemy plików nie zezwalają na używanie truncate() i ftruncate() do zwiększenia pliku poza jego aktualną długość: istotnym przykładem w Linuksie jest tu VFAT.
Na niektórych architekturach 32-bitowych, sygnatura wywołania dla tych wywołań systemowych może być zróżnicowana, z powodów opisanych w syscall(2).
POSIX.1-2008.
POSIX.1-2001, 4.4BSD, SVr4 (first appeared in 4.2BSD).
Pierwotne linuksowe wywołania truncate() i ftruncate() nie były zaprojektowane do obsługi przesunięć dużych plików. W konsekwencji, Linux 2.4 dodał wywołania systemowe truncate64() i ftruncate64(), które potrafią obsługiwać duże pliki. Detale te są jednak ignorowane przez aplikacje używające glibc, ponieważ jej funkcje opakowujące obsługują nowsze wywołania systemowe, gdy tylko są dostępne, w sposób przezroczysty.
ftruncate() można użyć również do ustawienia rozmiaru obiektu pamięci dzielonej POSIX; zob. shm_open(3).
Błąd w pliku nagłówka w glibc 2.12 powodował, że minimalną wartością _POSIX_C_SOURCE wymaganą do ujawnienia deklaracji ftruncate() była 200809L zamiast 200112L. Poprawiono to w następnych wersjach glibc.
Tłumaczenie niniejszej strony podręcznika: Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
| 15 czerwca 2024 r. | Linux man-pages 6.9.1 |