UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Иллюстрацией изложенного может служить упрощенная версия
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
