ВУЗ:
Составители:
else
if (pid == 0) { ... /*ребенок */ ... }
else {... /*родитель */ ... }
Задание: измените предыдущую программу с fork() так, чтобы роди-
тель и ребенок совершали разные действия (какие не важно).
Существует два способа корректного завершения процесса в про-
граммах, написанных на языке Си. Первый способ мы использовали до
сих пор: процесс корректно завершался по достижении конца функции
main() или при выполнении оператора return в функции main(), второй
способ применяется при необходимости завершить процесс в какомлибо
другом месте программы. Для этого используется функция exit() из стан-
дартной библиотеки функций для языка Си. При выполнении этой функ-
ции происходит сброс всех частично заполненных буферов вводавывода
с закрытием соответствующих потоков, после чего инициируется систем-
ный вызов прекращения работы процесса и перевода его в состояние за-
кончил исполнение. Возврата из функции в текущий процесс не проис-
ходит и функция exit() процессуродителю ничего не возвращает. Значе-
ние параметра функции exit(), то есть кода завершения процесса, переда-
ется ядру операционной системы и затем может быть получено процес-
сом, породившим завершившийся процесс. При этом используются только
младшие 8 бит параметра, так что для кода завершения допустимы значе-
ния от 0 до 255 (или от 128 до +127). По соглашению, код завершения О
означает безошибочное завершение процесса. На самом деле при дости-
жении конца функции main() также неявно вызывается эта функция со
значением параметра 0. Прототип функции exit() имеет вид
#include <stdlib.h>
void exit (int status);
Если процесс завершает свою работу раньше, чем его родитель,
и родитель явно не указал, что он не хочет получать информацию о ста-
тусе завершения порожденного процесса, то завершившийся процесс не
исчезает из системы окончательно, а остается в состоянии закончил ис-
26
• O_APPEND - при открытии файла и перед выполнением каждой
операции записи (если операция разрешена) указатель текущей пози-
ции в файле устанавливается на конец файла;
• O_TRUNC - если файл существует, уменьшить его размер до 0, с со-
хранением существующих атрибутов файла, кроме времени послед-
него доступа к файлу и времени его последней модификации.
Параметр mode устанавливает атрибуты прав доступа различных ка-
тегорий пользователей к новому файлу при его создании. Он обязателен,
если среди заданных флагов присутствует флаг O_CREAT, и может быть
опущен в противном случае. Этот параметр задается как сумма следую-
щих восьмеричных чисел X00+0X0+00X. Первое число определяет права
доступа владельца, второе группы, третье других пользователей. Каж-
дая восьмеричная цифра, обозначенная как «X», представляет собой триа-
ду двоичных цифр, соответствующих правам доступа rwx.
Системные вызовы read и write предназначены для осуществления
потоковых операций ввода (чтения) и вывода (записи) информации над
каналами связи, описываемыми файловыми дескрипторами, т.е. для фай-
лов pipe, FIFO и socket. Прототипы системных вызовов read и write.
#include <sys/types.h>
#include <unistd.h>
size_t read(int fd, void *addr, size_t nbytes);
size_t write (int fd, void *addr, size_t nbytes);
Параметр fd является файловым дескриптором созданного ранее по-
токового канала связи. Параметр addr представляет собой адрес области
памяти, начиная с которого будет браться информация для передачи или
размещаться принятая информация. Параметр nbytes, определяет количе-
ство передаваемых (для вызова write) или принимаемых байтов (для вызо-
ва read). Возвращаемое значение количество реально принятых (read)
или переданных (write) байтов.
15
Страницы
- « первая
- ‹ предыдущая
- …
- 14
- 15
- 16
- 17
- 18
- …
- следующая ›
- последняя »