如何与子线程共享变量?

问题描述 投票:0回答:2

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

var=0

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

{ watchdog;} &

# main program loop
((var++))

这段代码中的问题是$ var保持为0.我也尝试在看门狗调用周围没有{},同样的结果。

我的代码风格好吗?

bash
2个回答
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

但是我真的没有看到使用单独进程的重点。为什么不在每次更改后调用函数来测试值?


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已通过脚本更改。

© www.soinside.com 2019 - 2024. All rights reserved.