
- •Список сокращений
- •Введение
- •Отправка и обработка сигналов
- •Отправка сигналов
- •Обработка сигналов
- •Интерфейс signals
- •Интерфейс sigaction
- •Порождение дочерних процессов
- •Системный вызов fork
- •Обмен данными с дочерним процессом
- •Системный вызов getpid
- •Системный вызов getppid
- •Системные вызовы семейства exec
- •Замещение дочерних процессов
- •Библиотечный вызов popen
- •Библиотечный вызов system
- •Обмен данными через именованные каналы
- •Упражнения
- •Подготовка
- •Создание обработчиков сигналов
- •Создание дочерних процессов с помощью fork
- •Создание дочерних процессов с помощью popen
- •Обмен данными через именованный канал
- •Индивидуальные задания
- •Контрольные вопросы
- •Список литературы
Скомпилируйте файлы
gcc Child.c -o Child
gcc Parent.c -o Parent
Запустите файлы Parent. Убедитесь, что на экране появилось сообщение «I am Child!» – процесс родителя был замещен дочерним процессом Child.
Создание дочерних процессов с помощью popen
Создайте файл 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);
}
Скомпилируйте и запустите программу
gcc popen.c -o Popen ./Popen |
Убедитесь, что на экране появилось сообщение «I am Child!»
Создайте файл 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 |
Обмен данными через именованный канал
Создайте файлы 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;
}
Индивидуальные задания
Измените разработанную в п. Error: Reference source not found программу таким образом, чтобы по нажатию комбинации клавиш Ctrl+C выводилось сообщение «Good Bye!» и программа завершалась.
Добавьте в исходные кода, представленные в п. 5.5.1, возможность отправки ответного сообщения от программы fifoReader.
Контрольные вопросы
Какие существуют системные вызовы для отправки сигналов из программ, написанных на языке C?
Какие существуют интерфейсы для обработки сигналов в программах, написанных на языке С? В чем различие этих интерфейсов?
Какие действия осуществляет ОС Linux при получении вызова fork?
Чем вызов exec отличается от вызова popen?
В чем отличие системного вызова fork от exec?
Для чего существует так много вариантов вызова exec() (execl(), execle(), execlp(), execv(), execv())?
Что будет выведено на экран в результате работы следующей программы. Результат поясните.
...
fork();
fork();
fork();
printf(“Hello world!”);
...
В программе была создана переменная x=10. После произведен вызов fork и в родительском процессе её значение изменили на 11. Какое значение будет у переменной в дочернем процессе после данного изменения? Ответ поясните.
Как реализовать обмен данными между родительским и дочерним процессами через неименованные каналы в программе, написанной на языке С?
Как реализовать обмен данными через именованные каналы в программе, написанной на языке С?