Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Процессы, транспортеры, сигналы⇐ ПредыдущаяСтр 21 из 21
int fork (void) системная функция fork – средство для создания копии процесса, обратившегося этой функции. Единственное различие заключается в том, что значение, возвращаемое в старый (родительский) процесс, - это номер порожденного процесса, а значение, возвращаемое в новый процесс-потомок, равно нулю. Если функции не удалось создать новый процесс, то возвращается значение -1. Единственными совместно используемыми родителем и потомком ресурсами являются файлы, которые были открыты в момент распараллеливания родительского процесса. Они имеют общий указатель чтения-записи. switch (fork()) { case 0: { /* процесс-потомок */ } case –1: { /* неудача в создании нового процесса */ } default: { /* процесс-родитель */ } }
int execl (char *name, char *arg0, char *arg1, …, char *argn, 0) int execlp (char *file, char *arg0, char *arg1, …, char *argn, 0) int execv (char *name, char *argv[ ]) int execvp (char *file, char *argv[ ]) системная функция exec (ее любой вариант) замещает выполняемую в данный момент программу новой программой и начинает выполнять ее, передавая управление на ее точку входа. В случае успешной замены возврата из функции exec не происходит. Если функция exec передает управление в вызвавшую ее программу, то это свидетельствует об ошибке; возвращаемое значение в этом случае равно -1. Наиболее вероятная ошибка – файла не существует либо он не является исполняемым. Номер процесса функцией exec не меняется, неизменными остаются и состояния сигналов, кроме перехватываемых: они сбрасываются в нуль. После выполнения exec все открытые файлы остаются открытыми, их указатели чтения-записи не меняются: это позволяет родителю открывать файлы для потомка. Параметры name и file задают имя файла, содержащего программу, которую требуется выполнить (файл типа a.out); они различаются тем, что name - это полное имя файла (с указанием пути), file - имя файла в текущей директории. Параметр argv – массив указателей на параметры – строки литер, заканчивающиеся признаком конца строки; по соглашению argv[0] – имя исполняемого файла, последним элементом массива argv должен быть нулевой указатель. Вариант функции exec с параметром argv удобен в том случае, если количество аргументов вызова заранее не известно. Если аргументы известны заранее, то их можно задавать явно - arg0, arg1, …, argn, в этом случае arg0 должен быть именем исполняемого файла.
int wait (int *status) обращение к системной функции wait вызывает задержку выполнения вызвавшего ее процесса до тех пор, пока не будет получен какой-либо сигнал или не завершится один из процессов-потомков. Если в момент вызова wait нет ни одного порожденного данным процессом процесса-потомка, то возврат из wait происходит немедленно с кодом ошибки -1. При нормальном возврате передается номер завершившегося процесса. Если процессов-потомков несколько, то порядок их завершения не определен, чтобы узнать об их завершении, требуется обратиться к функции wait несколько раз. Ожидать завершения работы порожденных процессов может только их родительский процесс; если родитель завершается раньше процессов-потомков, то они наследуются процессом с номером 1. Если выполнение функции wait завершается из-за получения сигнала, то возвращается –1. Если указатель status отличен от нуля, то обычно в младший байт слова, на которое он указывает, помещается системное представление кода завершения процесса-потомка: оно равно нулю при нормальном завершении и не равно нулю при разного рода затруднениях. Следующий байт берется из аргумента вызова системной функции exit или возвращается из main, которой заканчивается выполнение процесса-потомка.
int exit (int status) системная функция exit представляет собой обычное средство завершения процесса. Функция exit закрывает все файлы данного процесса и уведомляет родительский процесс о завершении процесса-потомка, если он находится в состоянии ожидания. Родительскому процессу передаются младшие 8 бит статуса завершения status. По соглашению нуль означает успешное завершение процесса, а отличное от нуля значение – аварийное.
int getpid () int getppid () функция getpid возвращает номер обратившегося к ней процесса; чаще всего используется для формирования уникальных имен временных файлов. Функция getppid возвращает номер процесса-родителя обратившегося к ней процесса.
int pipe (int fd[2]) системная функция pipe создает механизм ввода-вывода для процессов-родственников, называемый транспортером (каналом). Через дескриптор fd[0] осуществляется чтение из канала, через fd[1] – запись в канал. Если канал пуст, то процесс, читающий из него, приостанавливается и будет ждать, пока в канал не будет записано какое-то количество литер. Если канал заполнен, а процесс пытается писать в него, то этот процесс будет приостановлен до тех пор, пока читающий процесс не прочитает некоторое количество литер из канала. Передача данных через канал обеспечивается по методу FIFO – «первым пришел – первым ушел». Предполагается, что взаимодействующие процессы передают данные через канал с помощью функций read и write. Функция чтения read возвращает признак конца файла, если канал пуст и в него некому писать (все дескрипторы для записи в этот канал закрыты).
int dup (int fd) int dup2 (int fd1, int fd2) по заданному дескриптору файла fd системная функция dup возвращает другой дескриптор файла с наименьшим свободным номером, эквивалентный исходному. Если fd не является дескриптором открытого файла или превышено число открытых файлов (обычно 20), функция dup возвращает –1. В результате выполнения системной функции dup2 дескриптор fd2 будет указывать на тот же файл, что и дескриптор fd1. Если с дескриптором fd2 уже был связан открытый файл, то он предварительно закроется. Если значение fd2 больше 20 либо fd1 не является дескриптором открытого файла, то dup2 возвращает –1. Например, с помощью этих функций, стандартный ввод может быть перенаправлен в канал следующим образом:
int p[2]; int p[2]; pipe(p); pipe(p); … либо … close(0); dup2(p[0], 0); dup(p[0]); close(p[0]); close(p[0]);
void (*signal (int sig, void (*handler)(int)))(int) системная функция signal устанавливает, как будет обрабатываться последующий сигнал sig. Если параметр handler равен SIG_DFL, то используется «обработка по умолчанию», зависящая от реализации; если значение handler равно SIG_IGN, то сигнал игнорируется; в остальных случаях будет выполнено обращение к функции, на которую указывает handler. Функция signal возвращает предыдущее значение обработчика этого сигнала. Если после выполнения функции signal придет сигнал sig, то сначала восстанавливается способность к его обработке «по умолчанию», а затем вызывается функция, заданная в handler, т.е. выполняется вызов (*handler)(sig). Если функция-обработчик вернет управление, то выполнение программы возобновится с того места, на котором программа была прервана пришедшим сигналом. Если требуется перехватывать сигнал при каждом его получении, то функция-обработчик должна обратиться к функции signal, определив способ обработки сигнала, иначе он будет обрабатываться «по умолчанию». Начальные значения обработчиков сигналов зависят от реализации. Некоторые системные функции могут завершиться преждевременно, не выполнив требуемых действий, если во время их работы был получен перехватываемый сигнал (например, при выполнении функций read или write для медленных устройств; при выполнении wait). В таких случаях при получении сигнала область состояния процесса модифицируется таким образом, что после выполнения функции-обработчика и возврата из него в точку прерывания, будет имитироваться возврат из прерванной системной функции с кодом ошибки. Программа пользователя, при желании, может повторить вызов этой системной функции.
Имена некоторых сигналов, определенных в < signal.h>:
SIGPIPE запись в транспортер, из которого некому читать. Это проис- ходит, если получатель завершает работу, оставляя пишущую сторону с разорванным транспортером; SIGALRM сигнал от таймера; SIGKILL уничтожение процесса. Этот сигнал не может быть ни перехва- чен, ни проигнорирован; SIGFPE арифметическая ошибка: деление на 0 или переполнение при выполнении операций с плавающей точкой; S IGINT прерывание от терминала; происходит при нажатии клавиш del или break; SIGSEGV обращение за пределы сегмента; SIGBUS ошибка шины; этот сигнал обычно возбуждается из-за ошибки в косвенной адресации с использованием указателей в про- грамме на С; SIGTERM сигнал программного прерывания; этот сигнал посылается по умолчанию командой kill; SIGTRAP трассировочное прерывание (используется отладчиком); SIGILL попытка выполнить нелегальную машинную команду; SIGABRT аварийное завершение;
int kill (int pid, int sig) системная функция kill посылает сигнал sig процессу, заданному номером процесса pid. Если sig не является номером сигнала из < signal.h> или указанного процесса не существует, то функция kill возвращает -1.
int alarm (unsigned seconds) системная функция alarm вызывает возбуждение сигнала SIGALRM в вызвавшем ее процессе через seconds секунд реального времени. Запросы на возбуждение сигнала не накапливаются. Последующие запросы на возбуждение сигнала (если они требуются) должны переустанавливаться в обработчике сигнала. Если значение параметра seconds равно 0, то ранее сделанный запрос на возбуждение сигнала игнорируется. Функция alarm возвращает интервал времени, оставшийся до возбуждения сигнала от предыдущей установки.
ЛИТЕРАТУРА 1. Б. Керниган, Д. Ритчи. Язык программирования Си. М., «Финансы и статистика», 1992 2. American National Standard for Information Systems - Programming Language C, X3.159-1989 3. Б. Керниган, Д. Ритчи, А. Фьюэр Язык программирования Си. Задачи по языку Си. М., «Финансы и статистика», 1985 4. Н. Джехани. Программирование на языке Си. М., «Радио и связь», 1988 5. Б. Керниган, Р. Пайк. Универсальная среда программирования UNIX. М., «Финансы и статистика», 1992 6. С. Баурн. Операционная система UNIX.М., «Мир», 1986 7. С.А. Абрамов, Г.Г. Гнездилова и др. Задачи по программированию. М., «Наука», 1988 8. В.Н. Пильщиков. Сборник упражнений по языку Паскаль. М., «Наука», 1989
СОДЕРЖАНИЕ
1. ПРЕДИСЛОВИЕ............................................................................................................................................. 3 2. ТИПЫ, ОПЕРАЦИИ, ВЫРАЖЕНИЯ......................................................................................................... 3 3. УПРАВЛЕНИЕ............................................................................................................................................... 8 3.1 Синтаксис и семантика операторов языка Си............................................................................. 8 3.2 Обработка числовых данных......................................................................................................... 11 3.3 Обработка символьных данных.................................................................................................... 14 4. ФУНКЦИИ И СТРУКТУРА ПРОГРАММЫ......................................................................................... 16 5. УКАЗАТЕЛИ И МАССИВЫ..................................................................................................................... 20 6. СТРУКТУРЫ, ОБЪЕДИНЕНИЯ.............................................................................................................. 28 6.1 Основные сведения............................................................................................................................ 28 6.2 Структуры и функции. Указатели на структуры...................................................................... 30 6.3 Структуры со сылками на себя...................................................................................................... 35 7. ВВОД-ВЫВОД............................................................................................................................................. 38 7.1 Стандартный ввод-вывод................................................................................................................ 38 7.2 Работа с файлами............................................................................................................................... 40 8. ИНТЕРФЕЙС С СИСТЕМОЙ UNIX....................................................................................................... 42 8.1 Низкоуровневый ввод-вывод.......................................................................................................... 42 8.2 Процессы, сигналы............................................................................................................................ 44 8.2.1 Конвейер, перенаправление ввода-вывода....................................................................... 44 8.2.2 Сигналы. Фоновые процессы................................................................................................. 47 9. ЗАДАНИЯ ПРАКТИКУМА...................................................................................................................... 50 9.1 Свойства транслятора...................................................................................................................... 50 9.2 Калькулятор........................................................................................................................................ 52 9.3 Моделирование работы интерпретатора SHELL.................................................................... 52 10. ПРИЛОЖЕНИЯ....................................................................................................................................... 55 10.1 Библиотека стандартных функций языка С............................................................................... 55 10.1.1 Функции работы со строками................................................................................................ 55 10.1.2 Функции проверки класса литер........................................................................................... 56 10.1.3 Ввод-вывод.................................................................................................................................. 57 10.1.3.1 Операции над файлами.................................................................................................. 57 10.1.3.2 Форматный вывод............................................................................................................ 58 10.1.3.3 Форматный ввод............................................................................................................... 60 10.1.3.4 Функции ввода-вывода литер....................................................................................... 62 10.1.3.5 Функции позиционирования файла............................................................................ 63 10.1.4 Математические функции....................................................................................................... 64 10.1.5 Функции общего назначения................................................................................................. 64 10.1.6 Дальние переходы.................................................................................................................... 65 10.2 Фрагменты стандарта языка Си.................................................................................................... 65 10.2.1 Классификация типов.............................................................................................................. 65 10.2.2 Приоритеты и порядок выполнения операций................................................................. 66 10.2.3 Арифметические преобразования при выполнении арифметических операций вида X op Y 67 10.2.4 Арифметические преобразования при выполнении присваивания и явного приведения 68 10.2.5 Неявное приведение типов в операторе присваивания X = Y..................................... 69 10.2.6 Явное приведение (тип Т) X.................................................................................................. 69 10.2.7 Адресная арифметика............................................................................................................. 70 10.3 Системные функции UNIX............................................................................................................... 71 10.3.1 Базисные средства ввода-вывода......................................................................................... 71 10.3.2 Дополнительные средства ввода-вывода.......................................................................... 72 10.3.3 Процессы, транспортеры, сигналы...................................................................................... 74 11. ЛИТЕРАТУРА.......................................................................................................................................... 78 12. СОДЕРЖАНИЕ........................................................................................................................................ 79
|