A ideia de canais de Go pode ser usada aqui:
mkfifo my_pipe
exec 3<>my_pipe
trap 'rm my_pipe' EXIT
printf a >&3
function _abc {
...
_check &
}
function _check {
until read -N1 -u3; do :; done
...
printf a >&3
}
Essencialmente:
- Crie um canal nomeado para comunicação entre instâncias de
_abc
e_check
. - Ter
_check
block em uma leitura do pipe (um byte no exemplo). - Inicie o primeiro
_check
imprimindo um caractere (não importa qual) para o pipe. Isso talvez deva ser feito fora da função se ela fizer um loop. - Solicite que cada instância
_check
escreva de volta no canal ao sair.
Para evitar gravações no bloqueio de pipe, adicionei o pipe como um descritor de arquivo aberto ao shell (consulte link ). Além disso, se vários read
s forem enfileirados no mesmo canal e um dos forçados deixar o canal vazio, os outros reportarão o EOF. Para superar isso, temos que fazer um loop em read
até conseguir ler.