[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Trap not being run for all CHLD signals, 4.3
From: |
Chet Ramey |
Subject: |
Re: Trap not being run for all CHLD signals, 4.3 |
Date: |
Mon, 08 Sep 2014 17:25:28 -0400 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 |
On 9/3/14, 10:08 AM, crispusfairbairn@gmail.com wrote:
> $ cat parallel-test.bash
> function process_job {
> sleep 1
> }
>
> function main {
> typeset -i index=0 cur_jobs=0 max_jobs=6
> trap '((cur_jobs--))' CHLD
> set -m
>
> while ((index++ < 30)); do
> echo -n "index: $index, cur_jobs: $cur_jobs"
> set +m
> childs=$(pgrep -P $$ | wc -w)
> (( childs < cur_jobs )) && echo -n ", actual childs: $childs"
> echo
> set -m
> process_job &
> ((++cur_jobs >= max_jobs)) && POSIXLY_CORRECT= wait;
> done
>
> echo 'finished, waiting for remaining jobs...'
> wait
> }
>
> main
> echo "done"
>
> This works on:
> GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
>
> But on:
> GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
> and
> GNU bash, version 4.3.24(1)-release (x86_64-unknown-linux-gnu)
>
> it will around "index: 9" start missing traps (not decrementing cur_jobs):
>
> $ bash-4.3.24/bin/bash parallel-test.bash
> index: 1, cur_jobs: 0
> index: 2, cur_jobs: 1
> index: 3, cur_jobs: 2
> index: 4, cur_jobs: 3
> index: 5, cur_jobs: 4
> index: 6, cur_jobs: 5
> index: 7, cur_jobs: 5
> index: 8, cur_jobs: 5
> index: 9, cur_jobs: 5, actual childs: 4
> index: 10, cur_jobs: 5, actual childs: 3
> index: 11, cur_jobs: 5, actual childs: 3
> ...
>
>
> If the sleep is changed to be random, it might work correctly for the whole
> 30 iterations, which points to a race condition somewhere?
The problem is running the wait builtin in posixly-correct mode. That
causes the first SIGCHLD to interrupt wait (as Posix requires) and results
in timing issues.
I will look at making SIGCHLD traps more reliable in the face of the Posix
requirements.
Chet
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU chet@case.edu http://cnswww.cns.cwru.edu/~chet/