- •Содержание
- •1. Теоретическая часть
- •1.1 Процессы. Создание процессов – функция fork()
- •1.2 Передача управления: execve()
- •1.3 Семейство exec().
- •1.4 Ожидание процесса wait().
- •1.5 Межпроцессорное взаимодействие, каналы( pipe() ).
- •2. Описание базовых программ
- •3. Список заданий
- •I. К части 1 (программа 2.1)
- •II . По части номер 2(программа 2)
- •III. По части номер 3(программа 3)
- •Список использованной литературы.
2. Описание базовых программ
Листинг программы № 2.1. Создание процесса. Идентификатор процесса.
Программа создает процесс, процесс получает свой PID и PID родителя и выводит оба значения на дисплей.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
part1() /*функция для создания*/
{
pid_t child,ppid; /*объявление переменных для хранения в них pid родителя и порожденного им процесса */
/*создание процесса*/
if ((child = fork()) < 0 ) /*если процесс не создан, функция завершается с кодом ошибки*/
{
return -1;
}
else if (child == 0 ) /*если процесс создан*/
{ /*код процесса - потомка*/
ppid = getppid(); /*получаем ppid родителя*/
printf("Process1 PID = %d\n",getpid());
printf("Process1 PPID = %d\n",ppid);
}
else
{
/*код процесса - родителя*/
}
return 0; /*успешное завершение функции, процесс создан*/
}
int main(int argc, char **argv)
{
if (part1() <0 )
{
fprintf(stderr,"%s: fork of child failed: %s\n", argv[0], strerror(errno));
exit(1);
}
return 0;
}
Результат работы программы:
Листинг программы №2. Запуск новой программы. Ожидание статуса завершения процесса.
Данная программа состоит из двух частей(двух исполняемых файлов, листинги которых приведены ниже) . Первая создает процесс, запускает вторую программу и ждет ее завершения. Вторая программа считает факториал 10 и выводит полученное значение на дисплей.
Программа №1
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
void part2(char **argv)
{
int status;
pid_t child = fork(); // создаем процесс
switch(child)
{
case -1:
fprintf(stderr,"%s: fork of child failed: %s\n",argv[0],strerror(errno));
break;
case 0:
//запускаем новую программу
execv("./kurs_part22",argv+2);
fprintf(stderr,"%s: failed: %s\n",argv[0],strerror(errno));
default:
//цикл будет повторяться пока не завершиться процесс с pid = child
while(child!=wait(&status))
/*ничего не делать*/
break;
printf("\nЗавершился порожденный процесс...\n");
exit(0);
}
}
int main(int argc, char **argv)
{
part2(argv);
return 0;
}
Программа №2
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
void part2()
{
int i,
faktorial = 1;
for(i = 1; i<10; i++)
faktorial = faktorial * i;
printf("\nФакториал 10 = %d " ,faktorial);
}
int main(int argc, char **argv)
{
part2();
return 0;
}
Результат работы программ:
Листинг программы №3. Обмен данными между процессами. Каналы .
Данная программа создает канал, в который родитель записывает фразу "Hello world!", далее создается процесс который читает записанную родителем фразу и выводит ее на экран.
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
void part3(char **argv)
{
int status;
char buf[BUFSIZ];
ssize_t rcount,wcount;
int pipefd[2];
size_t l;
static const char str[] = "Hello world!";
/*создание канала*/
if (pipe(pipefd) < 0 ){
// если ошибка то выводим сообщение о ней надисплей
fprintf(stderr,"%s: pipe failed: %s\n", argv[0],strerror(errno));
exit(1);
}
printf("Read end = fd %d, write end = fd %d\n",pipefd[0],pipefd[1]);
/*определяем длину строки*/
l = strlen(str);
/*запись в канал*/
if( (wcount = write(pipefd[1],str,l)) != l ) {
fprintf(stderr,"%s: write failed: %s\n", argv[0],strerror(errno));
exit(1);
}
// создаем процесс
pid_t child = fork();
switch(child)
{
case -1:
fprintf(stderr,"%s: fork of child failed: %s\n",argv[0],strerror(errno));
break;
case 0: {
/*чтение из канала*/
if( (rcount = read(pipefd[0],buf,BUFSIZ)) != wcount ) {
fprintf(stderr,"%s: read failed: %s\n", argv[0],strerror(errno));
exit(1);
}
/*дописываем символ завершени строки*/
buf[rcount] = '\0';
// выводим прочитанную порожденным процесс фразу на дисплей
printf("Read <%s> from pipe\n",buf);
/*закрываем канал*/
(void) close(pipefd[0]);
(void) close(pipefd[1]);
}
default:
break;
}
}
int main(int argc, char **argv)
{
part3(argv);
return 0;
}
Результат работы программ: