Добавил:
github.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
30.09.2023
Размер:
97.39 Кб
Скачать
      1. Скомпилируйте файлы

        gcc Child.c -o Child

        gcc Parent.c -o Parent

      2. Запустите файлы Parent. Убедитесь, что на экране появилось сообщение «I am Child!» ­– процесс родителя был замещен дочерним процессом Child.

    1. Создание дочерних процессов с помощью popen

      1. Создайте файл popen.c и добавьте в него следующий код:

#include <stdio.h>

#define STRLEN 10

int main()

{

    FILE *fp;

    int status;

    char str[STRLEN];

    fp = popen("./Child", "r");

    while (fgets(str, STRLEN, fp) != NULL)

        printf("%s", str);

    pclose(fp);

}

      1. Скомпилируйте и запустите программу

gcc popen.c -o Popen

./Popen

Убедитесь, что на экране появилось сообщение «I am Child!»

      1. Создайте файл pipe.c и добавьте в него следующий код. Скомпилируйте его и запустите. Убедитесь, что сообщение было передано по каналу и выведено родительским процессом.

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

int main(void)

{

    int fd[2];

    pid_t pid;

    char string[] = "Hello, Parent!\n";

    char readbuffer[80];

    pipe(fd);

    pid = fork();

    if (pid == 0)

    {

        close(fd[0]);

        write(fd[1], string, (strlen(string) + 1));

        exit(0);

    }

    else

    {

        close(fd[1]);

        read(fd[0], readbuffer, sizeof(readbuffer));

        printf("Parent received: %s", readbuffer);

    }

    return (0);

}

gcc pipe.c -o pipe

./pipe

    1. Обмен данными через именованный канал

      1. Создайте файлы fifoReader.c, fifoWriter.c и добавьте в него следующий код. Скомпилируйте программы и запустите. Убедитесь, что сообщение было передано по каналу и выведено программой fifoReader.

fifoWriter.c

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

    int fd;

    char *myfifo = "fifo";

    mkfifo(myfifo, 0666);

    char str[80];

    fd = open(myfifo, O_WRONLY);

    printf("Enter message:\n");

    scanf("%s", str);

    write(fd, str, strlen(str) + 1);

    close(fd);

    return 0;

}

fifoReader.c

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

    int fd;

    char *myfifo = "fifo";

    mkfifo(myfifo, 0666);

    char str[80];

    fd = open(myfifo, O_RDONLY);

    read(fd, str, 80);

    printf("Reader get: %s\n", str);

    close(fd);

    return 0;

}

  1. Индивидуальные задания

    1. Измените разработанную в п. Error: Reference source not found программу таким образом, чтобы по нажатию комбинации клавиш Ctrl+C выводилось сообщение «Good Bye!» и программа завершалась.

    2. Добавьте в исходные кода, представленные в п. 5.5.1, возможность отправки ответного сообщения от программы fifoReader.

  2. Контрольные вопросы

    1. Какие существуют системные вызовы для отправки сигналов из программ, написанных на языке C?

    2. Какие существуют интерфейсы для обработки сигналов в программах, написанных на языке С? В чем различие этих интерфейсов?

    3. Какие действия осуществляет ОС Linux при получении вызова fork?

    4. Чем вызов exec отличается от вызова popen?

    5. В чем отличие системного вызова fork от exec?

    6. Для чего существует так много вариантов вызова exec() (execl(), execle(), execlp(), execv(), execv())?

    7. Что будет выведено на экран в результате работы следующей программы. Результат поясните.

...

fork();

fork();

fork();

printf(“Hello world!”);

...

    1. В программе была создана переменная x=10. После произведен вызов fork и в родительском процессе её значение изменили на 11. Какое значение будет у переменной в дочернем процессе после данного изменения? Ответ поясните.

    2. Как реализовать обмен данными между родительским и дочерним процессами через неименованные каналы в программе, написанной на языке С?

    3. Как реализовать обмен данными через именованные каналы в программе, написанной на языке С?

Соседние файлы в папке OS_labs