首页 > 解决方案 > 如何与子线程共享变量?

问题描述

我想运行一个带有在子线程中启动的看门狗函数的 bash 脚本,当给定变量达到一个值时,它将停止我的程序。这个变量在主线程中递增。

var=0

function watchdog()
{
   if [[ $var -ge 3 ]]; then
       echo "Error"
   fi 
}

{ watchdog;} &

# main program loop
((var++))

这段代码中的问题是 $var 保持在 0。我还尝试在看门狗调用周围不使用 {},结果相同。

我的代码风格好吗?

标签: bash

解决方案


中的进程之间不能共享变量bash,也不支持多线程。所以你需要一种进程间通信的形式。最简单的方法之一是使用命名管道,也称为 FIFO。

这是和示例:

pipe='/tmp/mypipe'
mkfifo "$pipe"

var=0

# Your definition is not strictly correct (although it will work)
watchdog()
{  
   # Note the loop
   while read var
   do  
       if (( var >= 3 ))      # a better way to do numeric comparisons
       then
          echo "Error $var"
       else
          echo "$var"
       fi 
       sleep 2                # to prevent CPU hogging
   done
}

watchdog < "$pipe" &          # No need for a group

# main program loop - ??? I see no loop

((var++))
echo "$var" > "$pipe"

((var++))
echo "$var" > "$pipe"

((var++))
echo "$var" > "$pipe"

echo "waiting"
wait   
rm "$pipe"

示例运行:

$ bash gash.sh
1
waiting
2
Error 3

但是,我真的没有看到使用单独流程的意义。为什么不在每次更改后调用一个函数来测试值?


推荐阅读