Когда дочерний процесс желает получить доступ к result.agr, он посылает SIGUSR1 родительскому процессу и дожидается получения такого-же сигнала в ответ, после чего начинает обработку result.agr. Если в течении заранее заданного времени ответ от родительского процесса не получен, дочерний процесс повторяет отправку сигнала вплоть до получения ответа. По окончании обработки родительскому процессу посылается SIGUSR2.
Родительский процесс контролирует доступ к result.agr комбинациями сигналов SIGUSR1 и SIGUSR2. Получение SIGUSR1 при свободном result.agr побуждает родительский процесс зафиксировать факт захвата и подтвердить его дочернему процессу обратной отправкой SIGUSR1. Получение SIGUSR2 от дочернего процесса, захватившего ранее result.agr, освобождает result.agr. Пока result.agr захвачен одним дочерним процессом, попытки его захвата другими дочерними процессами сохраняются в очереди. По факту освобождения result.agr доступ к нему должен быть разрешен первому процессу в очереди.
Обработчик сигнала родительского процесса должен знать, от какого из дочерних процессов получен сигнал, чтобы отправить ответ. Для этого следует использовать обработчик с тремя параметрами. Второй параметр является ссылкой на структуру, одно из полей которой содержит значение pid процесса, пославшего сигнал.