배쉬 트랩 핸들러 경쟁 조건

배쉬 트랩 핸들러 경쟁 조건

나는 bash의 트랩 기능을 가지고 놀고 있습니다. 아래 스크립트는 일종의 경쟁 조건을 보여줍니다.

#! /bin/bash
set -x

trap sigusr1 USR1
ANCESTOR_PID=$$

function sigusr1
{
    num+=1
    declare -p num
}

function have_a_child
{
    sleep $(echo $((1 + RANDOM % 500)) / 1000 | bc -l) &
    wait $!
    kill -USR1 $ANCESTOR_PID
}

declare -i i=0
declare -i num=0

while (( i < 100 )); do
    have_a_child &
    i+=1
done

mkfifo -m 0400 /tmp/test.sh.fifo
read < /tmp/test.sh.fifo

즉, 100개의 하위 프로세스를 생성하고 0 ~ 500밀리초 동안 무작위로 대기 상태를 유지한 다음 각 하위 프로세스는 USR1 단일 메시지를 상위 프로세스로 보냅니다. 부모가 USR1 신호를 받으면 신호가 증가합니다.일련번호변수 1.

만약에 경쟁 조건 없음발생하고 모든 하위 프로세스에서 보낸 모든 USR1 신호는 상위 스크립트에 의해 처리됩니다.하나씩, 이것일련번호변수는100모든 하위 프로세스가 종료될 때. 하지만 나는 관찰했다일련번호무작위입니다.98, 93, 96...

따라서 여기서는 중첩 또는 함수 재진입이 진행되고 있는 것 같습니다. 트랩 핸들러가 일부 하위 프로세스에서 전송된 하나의 USR1 신호를 처리하는 동안 다른 USR1 신호는 다른 하위 프로세스에서 전송되며 아마도 세 번째 하위 프로세스도 관련될 수 있습니다. .

질문:

  1. 부모가 언제 여러 신호를 받는지, 부모가 여러 핸들러(예: 여러 스레드)를 생성하는지, 아니면 부모가 중첩된 프로세스 논리를 수행하는지 잘 모르겠습니다.

  2. 이 경쟁 조건을 해결하는 데 사용할 수 있는 bash 메커니즘이 있습니까?

관련 정보