Операционная система Linux. Докторов А.Е. - 17 стр.

UptoLike

Составители: 

Системный вызов close(fd) производит действие, обратное по отно-
шению к вызову open. Возвращаемое значение 0, если операция прошла
успешно, и1 в случае возникновения ошибки.
Системные вызовы stat, fstat и lstat служат для получения информа-
ции об атрибутах файла. Прототипы системных вызовов:
#include <sys/stat.h>
#include <unistd.h>
int stat(char *filename, struct stat *buf);
int fstat(intfd, struct stat *buf);
int lstat(char *filename, struct stat *buf);
Системный вызов stat читает информацию об атрибутах файла,
на имя которого указывает параметр filename, и заполняет ими струк-
туру, расположенную по адресу buf. Имя файла должно быть полным,
либо должно строиться относительно того каталога, который является
текущим для процесса, совершившего вызов. Если имя файла относит-
ся к файлу типа «связь», то читается информация об атрибутах файла,
на который указывает символическая связь.
Системный вызов lstat идентичен системному вызову stat за одним
исключением: если имя файла относится к файлу типа «связь», то читает-
ся информация о самом файле типа «связь».
Системный вызов fstat идентичен системному вызову stat, только
файл задается не именем, а своим файловым дескриптором (естественно,
что файл к этому моменту должен быть открыт).
Для системных вызовов stat и lstat процессу не нужны никакие права
доступа к указанному файлу, но могут понадобиться права для поиска во
всех каталогах, входящих в заданное имя файла.
Структура stat в различных версиях UNIX может быть описана по
разному. В Linux она содержит следующие поля:
struct stat {
dev_t st_dev; /* устройство, на котором расположен файл */
ino_t st_ino; /* номер индексного узла для файла */
16
/* При успешном создании нового процесса с этого места псевдопарал
лельно начинают работать два процесса: старый и новый */
(void)fork();
/* Узнаем идентификаторы текущего и родительского процесса (дальней-
шие действия будут выполняться в каждом из процессов) */
pid = getpid();
ppid = getppid();
/* Перед выполнением следующего выражения значение переменной а
в обоих процессах равно 0 */
а++;
/* Печатаем значения PID, PPID и вычисленное значение переменной а
(в каждом из процессов) */
printf("My pid = %d, my ppid = %d, result = %d\n", (int)pid, (int)ppid, a);
return 0;
}
Задание: измените программу так, чтобы увеличение значения пе-
ременной а и вывод на экран монитора выполнялось в цикле. Количество
повторений выберите такое, чтобы за один квант времени, выделенный
процессу, программа выполнила только часть цикла.
Для того чтобы после возвращения из системного вызова fork() про-
цессы могли определить, кто из них является ребенком, а кто родителем,
и, соответственно, поразному организовать свое поведение, системный
вызов возвращает в них разные значения. При успешном создании нового
процесса процессуродителю возвращается положительное значение, рав-
ное идентификатору процессаребенка. А процессуребенку возвращается
значение 0. Если по какойлибо причине создать новый процесс не уда-
лось, то системный вызов вернет в инициировавший его процесс значение
1. Таким образом, общая схема организации различной работы процесса
ребенка и процессародителя выглядит так:
pid =fork();
if (pid ==-1) { ... /* ошибка */ ...}
25