Иллюстрацией изложенного может служить упрощенная версия
cp/* cp: minimal version */#include <stdio.h>#define PERMS 0644 /* RW for owner, R for group, others */char *progname;main(argc, argv) /* cp: copy f1 to f2 */ int argc; char *argv[];{ int f1, f2, n; char buf[BUFSIZ]; progname = argv[0]; if (argc != 3) error("Usage: %s from to", progname); if ((f1 = open(argv[1], 0)) == -1) error("can't open %s", argv[1]); if ((f2 = creat(argv[2], PERMS)) == -1) error("can't create %s", argv[2]); while ((n = read(f1, buf, BUFSIZ)) > 0) if (write(f2, buf, n) != n) error("write error", (char*)0); exit(0);}errorЧисло файлов, которые одновременно могут быть открыты программой, ограничено (обычно порядка 20; см.
NOFILE<SYS/param.h>closeexiterrnoОбсуждаемые здесь системные вызовы, а по сути все системные вызовы, могут вызывать ошибки. Обычно они сигнализируют об ошибке, возвращая значение -1. Иногда полезно знать, какая именно ошибка произошла, поэтому системные вызовы, когда это приемлемо, оставляют номер ошибки во внешней целой переменной, называемой
errnoerrnosys_errlisterrnoerror(s1, s2) /* print error message and die */ char *s1, *s2;{ extern int errno, sys_nerr; extern char *sys_errlist[], *progname; if (progname) fprintf(stderr, "%s: ", progname); fprintf(stderr, s1, s2); if (errno > 0 && errno < sys_nerr) fprintf (stderr, " (%s)", sys_errlist[errno]); fprintf(stderr, "\n"); exit(1);}Errnosys_herr.cp$ cp foo barcp: can't open foo $ date >foo; chmod 0 foo $ cp too barcp: can't open foo $lseekФайл ввода-вывода обычно последовательный: каждый
readwritelseekint fd, origin;long offset, pos, lseek();pos = lseek(fd, offset, origin);Текущая позиция в файле с дескриптором
fdoffsetoriginOriginoffsetВозвращаемое значение есть новая абсолютная позиция или -1 при ошибке. Например, при добавлении информации в файл нужно дойти до его конца, а затем выполнить запись:
lseek(fd, 0L, 2);Чтобы вернуться обратно к началу ("перемотать"), необходимо вызвать
lseek(fd, 0L, 0);Для определения текущей позиции следует выполнить
pos = lseek(fd, 0L, 1);Обратите внимание на аргумент
0Lseek