Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_процессы.doc
Скачиваний:
1
Добавлен:
27.11.2019
Размер:
225.28 Кб
Скачать

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;

}

Результат работы программ:

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