
- •Список сокращений
- •Введение
- •Отправка и обработка сигналов
- •Отправка сигналов
- •Обработка сигналов
- •Интерфейс signals
- •Интерфейс sigaction
- •Порождение дочерних процессов
- •Системный вызов fork
- •Обмен данными с дочерним процессом
- •Системный вызов getpid
- •Системный вызов getppid
- •Системные вызовы семейства exec
- •Замещение дочерних процессов
- •Библиотечный вызов popen
- •Библиотечный вызов system
- •Обмен данными через именованные каналы
- •Упражнения
- •Подготовка
- •Создание обработчиков сигналов
- •Создание дочерних процессов с помощью fork
- •Создание дочерних процессов с помощью popen
- •Обмен данными через именованный канал
- •Индивидуальные задания
- •Контрольные вопросы
- •Список литературы
Упражнения
Подготовка
В соответствии с п. 3.1 из Упражнений первой лабораторной работы подключитесь к командной оболочке Raspberry Pi.
Перейдите в каталог с вашими проектами:
cd IVT31_Ivanov_Ivan
Создайте директорию для файлов текущей лабораторной работы:
mkdir lab5_Фамилия
cd lab5_Фамилия
Создание обработчиков сигналов
Скомпилируйте и запустите следующий пример, обрабатывающий сигнал 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 |
Сгенерируйте SIGINT разными способами:
ctrl+C,
kill -2 PID,
kill -SIGINT PID.
Убедитесь, что вместо завершения работы программы, во всех случаях появляется сообщение «Exit(y/n)»
Скомпилируйте и запустите следующий пример, обрабатывающий сигнал 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 |
Сгенерируйте сигнал SIGINT и убедитесь, что вместо завершения работы программы, во всех случаях появляется сообщение «Exit(y/n)»
Создание дочерних процессов с помощью fork
Создайте файл с будущей программой
touch prog.c
С помощью редактора 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; }
|
Скомпилируйте программу
gcc prog.c -o prog
Запустите получившийся файл и убедитесь, что на экране появилось сообщение «Hello world!»
./prog
Очистите директорию и создайте файлы 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;
}