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

    1. Подготовка

      1. В соответствии с п. 3.1 из Упражнений первой лабораторной работы подключитесь к командной оболочке Raspberry Pi.

      2. Перейдите в каталог с вашими проектами:

        cd IVT31_Ivanov_Ivan

      3. Создайте директорию для файлов текущей лабораторной работы:

        mkdir lab5_Фамилия

        cd lab5_Фамилия

    2. Создание обработчиков сигналов

      1. Скомпилируйте и запустите следующий пример, обрабатывающий сигнал SIGINT.

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

void sigfunc(int sig)

{

  char c;

  if (sig != SIGINT)

    return;

  else {

    printf("\nExit(y/n) : ");

    while ((c = getchar()) != 'y')

      return;

    exit(0);

  }

}

int main()

{

  signal(SIGINT, sigfunc);

  while (1) {

  }

  return 0;

}

gcc Signal.c -o Signal

./Signal

      1. Сгенерируйте SIGINT разными способами:

  • ctrl+C,

  • kill -2 PID,

  • kill -SIGINT PID.

Убедитесь, что вместо завершения работы программы, во всех случаях появляется сообщение «Exit(y/n)»

      1. Скомпилируйте и запустите следующий пример, обрабатывающий сигнал SIGINT с помощью структуры sigaction.

#include <stdio.h>

#include <sys/types.h>

#include <signal.h>

#include <errno.h>

#include <stdlib.h>

void sigfunc(int sig)

{

    char c;

    if (sig != SIGINT)

        return;

    else {

        printf("\nExit(y/n) : ");

        while ((c = getchar()) != 'y')

            return;

        exit(0);

    }

}

int main(int argc, char **argv)

{

    struct sigaction sa;

    sa.sa_handler = sigfunc;

    sa.sa_flags = SA_RESTART;

    sigaction(SIGINT, &sa, 0);

    while (1) {

    }

    return 0;

}

gcc Sigaction.c -o Sigaction

./Sigaction

      1. Сгенерируйте сигнал SIGINT и убедитесь, что вместо завершения работы программы, во всех случаях появляется сообщение «Exit(y/n)»

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

      1. Создайте файл с будущей программой

        touch prog.c

      2. С помощью редактора nano добавьте в файл следующий текст программы

nano prog.c

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

#include <sys/wait.h>

int main()

{

    pid_t PID = fork();

    if (PID == 0)

    {

        printf("Hello ");

    }

    else

    {

        wait(0);

        printf("world!\n");

    }

    return 0;

}

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

        gcc prog.c -o prog

      2. Запустите получившийся файл и убедитесь, что на экране появилось сообщение «Hello world!»

        ./prog

      3. Очистите директорию и создайте файлы Parent.c и Child.c.

Parent.c

#include <stdlib.h>

#include <unistd.h>

#include <stdio.h>

int main()

{

    execl("Child", "Child", NULL);

    printf("I am Parent!\n");

    return 0;

}

Child.c

#include <unistd.h>

#include <stdio.h>

int main()

{

    printf("I am Child!\n");

    return 0;

}

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