1

我有一个被调用的 bash 函数必须在第一次调用后被 EXIT 陷阱调用。该函数将再次设置陷阱以在函数退出后立即触发。

echo 0 > .i
function launchNextExperiment
{
( # Run in nested subshell

  # Implement a mutex lock, not shown

  j=`cat .i`
  if [ $j -lt $k ]
  then
  trap launchNextExperiment EXIT # set trap for this nested subshell

  ./doStuff &

  let j=j+1
    echo $j > .i # variables are not known in outer shell, therefore use
                 # the file .i as a counter
  fi

  wait # wait for doStuff to return from background before exiting
       # from this nested shell and causing an EXIT signal
)
}

launchNextExperiment &

我遇到的问题是陷阱只触发一次,换句话说doStuff只执行了两次。

我不使用简单的 for 循环来执行doStuff k时间的原因是,我实际上launchNextExperiment为我的 CPU 子集的每个调用该函数一次,并且一次只希望一个实例doStuff在 CPU 上运行,因为它非常处理密集的。这也是我有互斥锁的原因。然后,一旦一个实例doStuff返回,我就想启动下一个k实例doStuff(实际上它们都是不同的模拟)。

如何确保为每个嵌套的子 shell 设置了陷阱,最后launchNextExperiment是执行时间,但每个 CPUk只有一个?doStuff

4

1 回答 1

0

不是你的问题的答案,但你想要完成的事情可以在没有陷阱和子shell的情况下完成:

echo 0>i
k=10
dispatch_work()
{
  mutex_lock
  i=$(<i)
  let i++
  echo $i>i
  mutex_unlock

  if [ $i < $k ]; do
    do_work $i
    dispatch_work
  fi
}

for c in $(seq 1 $cpus); do
  dispatch_work &
done
于 2010-11-14T02:34:32.913 回答