Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Программирование на GNU assembler Linux x86-64. Ожидание конца работы дочернего процесса, wait (книга)

Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня говорим об ожидании конца работы дочернего процесса. Параграф 7.3 Использование системной функции wait4 Рассмотрим частный вопрос, связанный с взаимодействием родительского и дочернего процесса. В некоторых случаях родительскому процессу важно знать, что дочерний процесс закончил свою работу. Для этого в частности можно использовать системная функция wait4 (номер 61). Приводим простой пример запуска дочернего процесса, в котором запускается приложение и ожидание родительского процесса, когда дочерний процесс закончит свою работу. Для простоты для запуска была взята системная утилита Linux ls, которая рекурсивно осуществляет поиск по каталогам, начиная с данного. Параметра заданы непосредственно в тексте программы (см. Листинг 65). Чтобы позволить разделить вывод на консоль их дочернего и родительского процессов, родительский процесс будет осуществлять вывод в пото

Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня говорим об ожидании конца работы дочернего процесса.

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer27 мая 2021
Книга "Ассемблер для Linux"
Old Programmer4 июля 2021
Из записок старого программиста. Притчи о компьютерных жителях. Товарищ Комманд Ком, Диггер и отец Виндовс...
Old Programmer31 июля 2020

Параграф 7.3

Использование системной функции wait4

Рассмотрим частный вопрос, связанный с взаимодействием родительского и дочернего процесса. В некоторых случаях родительскому процессу важно знать, что дочерний процесс закончил свою работу. Для этого в частности можно использовать системная функция wait4 (номер 61). Приводим простой пример запуска дочернего процесса, в котором запускается приложение и ожидание родительского процесса, когда дочерний процесс закончит свою работу. Для простоты для запуска была взята системная утилита Linux ls, которая рекурсивно осуществляет поиск по каталогам, начиная с данного. Параметра заданы непосредственно в тексте программы (см. Листинг 65). Чтобы позволить разделить вывод на консоль их дочернего и родительского процессов, родительский процесс будет осуществлять вывод в поток ошибок.

В листинге 66 представлены вспомогательные функции, написанные на языке C, которые используются в основной программе.

Пояснения к листингу 65.

1. Структура программы аналогичнапрограмме из предыдущего параграфа. Но параметры запуска здесь зашиты непосредственно в программном тексте (см. блок строк commи массив указателей arr на него).

2. В программе есть один важный нюанс. При создании процесса родительский процесс несколько опережает дочерний процесс. Чтобы функция wait4при запуске обнаружила запущенный дочерний процесс или его окончание, в родительском процессе запускается функция tim которая реализует системное ожидание длиной в одну секунду. Таким образом родительскийпроцесс в любом случае обнаруживает конец дочернего процесса. Если дочерний процесс выполняется, то функция wait4ждет окончания его выполнения, а потом возвращает управление. Если дочерний процесс уже закончился, то wait4 сразу заканчивает свою работу. Таким образом сообщение об окончании работы дочернего процесса покажет действительное его окончание.

3. Системная функция wait4 имеет параметр. Первым параметром, в частности можно указать идентификатор дочернего процесса. Он у нас хранится в переменной res. Вторым параметром является адрес переменной, куда помещается статус дочернего процесса. В нашем случае мы статус не анализируем, поскольку нам важно только, что дочерний процесс работу закончил. Третий параметр определяет условие возвращения из функции wait4. В нашей программе принято условие, что возврат осуществляется, если дочерний процесс закончил работу. Четвертый параметр является указателем на структуру, куда будет возвращена информация о дочерних процессах. Указатель может быть равен NULL (0), этим мы и воспользовались в нашей программе.

Для трансляции программы следует выполнить последовательность команд.

as --64l74.s -ol74.o
gcc -cl75.c
gcc -no-piel74.o l75.o -ol74

Пример запуска программы

./l74 > lls

При этом весь вывод дочернего процесса пойдет в файл lls, а родительский процесс выведет все в поток ошибок, т.е. на консоль.

На сегодня все. Подписываемся на мой канал Old Programmer и ставьте "лайки". А я продолжаю заниматься книгой Ассемблер для Linux 64.

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer27 мая 2021

<--Глава 6. Параграф 7.2 --> Глава 6. Параграф 7.4

Фрагмент программы l74.s
Фрагмент программы l74.s

#программирование #программисты #ассемблер #assembler #языки программирования