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

UptoLike

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

зывать процессомребенком (child process). Процессребенок является
почти полной копией родительского процесса. Но у порожденного про-
цесса изменяются значения следующих параметров:
идентификатор процесса;
идентификатор родительского процесса;
время, оставшееся до получения сигнала SIGALRM;
сигналы, ожидавшие доставки родительскому процессу, не будут
доставляться порожденному процессу.
При однократном системном вызове fork возврат из него может про-
изойти дважды: один раз в родительском процессе, а второй раз в порож-
денном процессе. Если создание нового процесса произошло успешно,
то в порожденном процессе системный вызов вернет значение 0, а в роди-
тельском процессе положительное значение, равное идентификатору
процессаребенка. Если создать новый процесс не удалось, то системный
вызов вернет в инициировавший его процесс отрицательное значение. По-
сле выхода из системного вызова оба процесса продолжают выполнение
регулярного пользовательского кода, следующего за системным вызовом.
Задание: Наберите следующую программу, откомпилируйте ее и за-
пустите на исполнение (лучше всего это делать не из оболочки тс, так как
она не очень корректно сбрасывает буферы вводавывода). Проанализи-
руйте полученный результат.
/* Пример создания нового процесса с одинаковой работой процессов
ребенка и родителя */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid, ppid;
int a = 0;
24
mode_t st_mode; /* тип файла и права доступа к нему */
nlink_t st_nlink; /* счетчик числа жестких связей */
uid_t st_uid; /* идентификатор пользователя владельца */
gid_t st_gid; /* идентификатор группы владельца */
dev_t st_rdev; /* тип устройства для специальных файлов устройств*/
off J st_size; /* размер файла в байтах */
unsigbed long st_blksize; /* размер блока для файловой системы */
unsigned long st_blocks; /* число выделенных блоков */
time_t st_atime; /* время последнего доступа к файлу */
time_t st_mtime; /* время последней модификации файла */
time_t st_ctime; /* время создания файла */
}
Для определения типа файла можно использовать следующие логи-
ческие макросы, применяя их к значению поля st_mode:
S_ISLNK(m) файл типа «связь»?
S_ISREG(m) регулярный файл?
S_ISDIR(m) каталог?
S_ISCHR(m) - специальный файл символьного устройства?
S_ISBLK(m) специальный файл блочного устройства?
S_ISFIFO(m) файл типа FIFO?
S_ISSOCK(m) - файл типа "socket"?
Младшие 9 бит поля st_mode определяют права доступа к файлу по-
добно тому, как это делается в маске создания файлов текущего процесса.
Системные вызовы для создания связи: link, symlink, unlink.
#include <unistd.h>
int link(char *pathname, char *linkpathname);
int symlink(char *pathname, char *linkpathname);
int unlink(char *pathname);
Задание: рассмотренные ранее по пунктам 13 действия над файла-
ми реализуйте в программе на языке Си с помощью системных вызовов.
17