5 Контрольные вопросы
1. Что такое процесс? Что такое идентификационный номер процесса? Какие команды ОС Linux позволяют получить сведения о том, какие процессы сейчас запущены?
2. Как осуществляется запуск нового процесса? Как работает системный вызов fork()? Для чего служит системный вызов exec()?
3. С помощью какого системного вызова можно завершить работу процесса?
4. Что такое программный канал? Как организовать передачу данных от одного процесса другому через канал?
5. Что такое дескриптор файла? С помощью каких системных вызовов можно организовать запись в файл, чтение из файла? Какие возможны ошибочные ситуации при использовании этих системных вызовов?
6. Что такое системный вызов?
7. Каково назначение параметров функции main?
Приложение А
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
void reader(int); /*функция чтения набора чисел из канала*/
void generator(int, int); /*функция генерации и записи набора чисел в канал*/
void myerror(char *); /*функция обработки ошибок системных вызовов*/
int main(int argc, char * argv[])
{
if (argc != 2)
{
printf("вызов: %s количество_наборов_чисел \n", argv[0]);
exit(1);
}
else
{
int pipefd[2]; /*массив дескрипторов программного канала*/
if (pipe(pipefd) == -1)
myerror("ошибка создания канала");
switch (fork())
{
case -1:
myerror("ошибка fork");
break;
case 0:
printf("Порожденный процесс pid=%d\n", getpid());
close(pipefd[0]);
generator(pipefd[1], atoi(argv[1]));
close(pipefd[1]);
break;
default:
printf("Родительский процесс pid=%d\n", getpid());
close(pipefd[1]);
reader(pipefd[0]);
close(pipefd[0]);
break;
}
}
return 0;
}
void generator(int fd, int n)
/*функция генерации набора случайных чисел нужных диапазонов *
/* и записи набора чисел в канал */
/* fd - дескриптор записываемого конца канала */
/* n - количество генерируемых наборов неупакованных чисел*/
{
int i;
unsigned short mas[4]; /* массив для генерируемого набора чисел */
int nmas = sizeof mas; /* количество байт, занимаемых массивом */
int nw; /* количество байт, фактически записанных в канал */
/*генерация и запись n наборов*/
srand(time(NULL));
for (i = 0; i < n; i++)
{
sleep(2); /*ожидание 2 секунды*/
mas[0] = (unsigned short) rand() % 32; /* код состояния (0 - 31)*/
mas[1] = (unsigned short) rand() % 2; /* признак ошибки (0 - 1)*/
mas[2] = (unsigned short) rand() % 2; /*признак занятости (0 - 1)*/
mas[3] = (unsigned short) rand() % 256; /* количество байт (0 - 255)*/
if ((nw = write(fd, mas, nmas)) != nmas)
{
myerror("ошибка записи"); /*ошибка записи*/
}
printf("набор отправлен в канал\n");
}
}
void reader(int fd)
/*функция чтения набора чисел из канала*/
{
unsigned short mas[4]; /* массив для читаемого набора чисел */
int nr; /* количество байт, фактически прочитанных из файла */
int nmas = sizeof mas; /* количество байт, занимаемых массивом */
/*чтение из файла данных порциями по blksize байт
и вывод прочитанных чисел на экран*/
while ((nr = read(fd, mas, nmas)) == nmas)
{
printf("набор принят из канала\n");
printf("Код состояния = %hu\n", mas[0]);
printf("Признак ошибки = %hu\n", mas[1]);
printf("Признак занятости = %hu\n", mas[2]);
printf("Количество переданных байт = %hu\n", mas[3]);
}
if (nr < 0)
{
myerror("ошибка чтения"); /*ошибка чтения*/
}
}
void myerror(char * st)
/*функция обработки ошибок системных вызовов*/
{
perror(st);
exit(1);
}