如何与子线程共享变量?

时间:2019-02-01 14:17:03

标签: bash

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

var=0

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

{ watchdog;} &

# main program loop
((var++))

此代码中的问题是$ var保持为0。我也尝试在看门狗调用中不使用{},同样的结果。

我的代码风格好吗?

2 个答案:

答案 0 :(得分:1)

您无法在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

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

答案 1 :(得分:0)

如果以前使用.运行bashscript,它将使用相同的环境,并且可以更改现有变量。看这个:

$ cat test.sh
#!/usr/bin/env bash
a=12
echo $a
$ a=1
$ echo $a
1
$ ./test.sh 
12
$ echo $a
1
$ . ./test.sh 
12
$ echo $a
12

我运行. ./test.sh后,变量$ a已通过脚本更改。