Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IT4.doc
Скачиваний:
8
Добавлен:
03.03.2016
Размер:
97.79 Кб
Скачать

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);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]