Istnieje też specjalna postać open: int creat(const char *pathname, mode_t mode); równoważna open(pathname, O_CREAT|O_WRONLY|O_TRUNC, mode)

W przypadku powodzenia open i creat zwracają numer otwartego deskryptora pliku. W przypadku błędu zwracają -1 a errno jest ustawiana na kod błędu.

int close(int fd); zamyka otwarty deskryptor pliku. W dawnych czasach close nie zwracało kodu błędu, więc nikt go nie sprawdzał. Współcześnie zwraca kod błędu, co z punktu widzenia architektury systemu jest kompletnym nieporozumieniem – nikt tak naprawdę nie zdefiniował co konkretnie ma znaczyć błąd przy zamykaniu pliku i co program ma z tym zrobić.

Kernel może zwracać błędy EBADF (deskryptor jest zły), EINTR i dość ogólny EIO (błąd wejścia/wyjścia).

Tworzenie plików specjalnych – mkdir, mkfifo, mknod open i creat potrafią tworzyć tylko zwykłe pliki. Do tworzenia innych plików stworzono osobne wywołania systemowe.

Katalogi tworzy się za pomocą: int mkdir(const char *pathname, mode_t mode); gdzie pathname i mode mają znaczenie podobne jak w creat.

Pliki urządzeń tworzy się za pomocą: int mknod(const char *pathname, mode_t mode, dev_t dev); gdzie pathname i mode mają to samo znaczenie a dev to informacje o typie urządzenia.