UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
system(s) /* run command line s */ char *s;{ int status, pid, w, tty; int (*istat)(), (*qstat)(); extern char *progname; fflush(stdout); tty = open("/dev/tty", 2); if (tty == -1) { fprintf(stderr, "%s: can't open /dev/ttyn", progname); return -1; } if ((pid = fork()) == 0) { close(0); dup(tty); close(1); dup(tty); close(2); dup(tty); close(tty); execlp("sh", "sh", "-c", s, (char*)0); exit(127); } close(tty); istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); while ((w = wait(&status)) != pid && w != -1) ; if (w == -1) status = -1; signal(SIGINT, istat); signal(SIGQUIT, qstat); return status;}Отметим, что
/dev/ttydup$ echo hello 1>&0hello$Это означает, что вам следует применить
dup/dev/ttysystemttyttinpСмысл изложенного выше состоит не в том, что вы должны использовать нашу версию
systemedsystem7.5 Сигналы и прерывания
Теперь мы рассмотрим работу с сигналами извне (такими, как прерывания) и ошибками программы. Последние возникают главным образом из-за некорректных обращений к памяти, выполнения привилегированных команд или при выполнении операций с плавающей запятой. Наиболее распространенными внешними сигналами являются прерывание, посылаемый при печати символа del, выйти, генерируемый символом FS (ctrl-), отбой, вызываемый завершением телефонной связи, и закончить, генерируемый командой
killadb(1)sdb(1)Системный вызов
signal<signal.h>#include <signal.h>signal(SIGINT, SIG_IGN);Специфицирует игнорирование прерываний, тогда как
signal(SIGINT, SIG_DEL);восстанавливает действие по умолчанию, означающее завершение процесса. В любом случае
signalsignal#include <signal.h>char *tempfile = "temp.xxxxxx";main() { extern onintr(); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, onintr); mktemp(tempfile); /* Process ... */ exit(0);}onintr() { /* почистить, если прервано */ unlink(tempfile); exit(1);}Почему в
mainsignal&shellonintrshell
