8 ŚRODOWISKO SYSTEMU UNIX -_-_----
BUFSIZ liczbę bajtów, które mają być wypisane przez write: następne po tym wywołanie read zwróci wartość zero.
Warto zobaczyć, jak za pomocą funkcji read i write można zbudować funkcje wyższego poziomu, jak getchar, putchar itp. Przykładowo prezentiljemy wersję funkcji get-char, która czyta z wejścia bez buforowania danych, to znaczy po jednym znaku na raz.
#include "syscalls.h"
/* getchar: wejście jednoznakowe niebuforowane */ int getchar(void)
char c;
return (read(0, &c, 1) == 1) ? (unsigned char) c : EOF;
Zmienna c musi być typu char. ponieważ funkcja read akceptuje jedynie wskaźniki do znaków. Rzutowanie c do typu unsigned char w instrukcji return eliminuje jakiekolwiek problemy związane z powielaniem bitu znaku.
W drugiej wersji funkcja getchar wczytuje dane wielkimi porcjami, a oddaje każdorazowo po jednym znaku.
#include "syscalls.h”
/* getchar: prosta wersja buforująca */ int getchar(void)
static char buf[BUFSIZ]; static char *bufp = buf; static int n = 0;
if (n == 0) { I* bufor jest pusty */ n = read(0, buf, sizeof buf); bufp = buf;
return (--n >= 0) ? (unsigned char) *bufp++ : EOF;
Jeśli tę wersję funkcji getchar chciałbyś przetłumaczyć z dołączonym nagłówkiem <stdio.h>, to gdy standardową wersję getchar zrealizowano jako makro, wówczas jego definicję należy odwołać za pomocą #undef.
8.3 FUNKCJE OPEN, CREAT, CLOSE, UNLINK
Pliki inne niż standardowe wejście, standardowe wyjście i standardowe wyjście błędów muszą być jawnie otwarte, zanim zaczniesz z nich czytać lub do nich pisać. Do tego celu służą dwa odwołania systemowe open i creat (sic! - od ang. create - utwórz).
Funkcja open przypomina omówioną w rozdz. 7 funkcję fopen, zamiast wskaźnika do pliku zwraca jednak deskryptor pliku (deskryptor jest typu int). W przypadku błędu open zwraca —1. /
#include <fcntl.h> int fd;
int open(char *name, int flags, int perms); fd = open(name, flags, perms);
Podobnie jak w funkcji fopen. argument name jest ciągiem znaków zawierającym nazwę pliku. Drugi argument, flags, jest liczbą typu int, określającą sposób otwarcia wskazanego pliku. Jego najważniejszymi wartościami są:
O.RDONLY otwarcie tylko do pisania
CLWRONLY otwarcie tylko do czytania
0_RDWR otwarcie zarówno do czytania, jak i pisania
Te stałe zdefiniowano w nagłówku <fcntl.h> dla rodziny systemów Unix System V oraz w nagłówku <sys/file.h> dla systemów Unix w wersji Berkeley (BSD).
Aby otworzyć już istniejący plik do czytania, należy na przykład napisać
fd = open(name, 0_RD0NLY, 0);
W omawianych przez nas przykładach otwarć plików trzeci argument, perms, zawsze będzie równy zero.
Próba otwarcia pliku, który nie istnieje, jest błędem. Do tworzenia nowego pliku lub do zapisania na nowo już istniejącego służy odwołanie systemowe creat.
int creat(char *name, int perms); fd = creat(name, perms);
229