bash - 如何与子线程共享变量?
问题描述
我想运行一个带有在子线程中启动的看门狗函数的 bash 脚本,当给定变量达到一个值时,它将停止我的程序。这个变量在主线程中递增。
var=0
function watchdog()
{
if [[ $var -ge 3 ]]; then
echo "Error"
fi
}
{ watchdog;} &
# main program loop
((var++))
这段代码中的问题是 $var 保持在 0。我还尝试在看门狗调用周围不使用 {},结果相同。
我的代码风格好吗?
解决方案
中的进程之间不能共享变量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
但是,我真的没有看到使用单独流程的意义。为什么不在每次更改后调用一个函数来测试值?
推荐阅读
- php - Guzzel 异常 - 500 内部服务器错误
- .net - 将 .Net Framework 类库添加到 .Net 核心控制台应用程序是否是个好主意
- maven - 在 azure pipeline mule 4 中无法执行 maven 的目标
- arrays - 排序 MongoDB 文档
- python - python烧瓶查询对象类型
- sql - 更新查询未更新 sql 表中的记录
- javascript - 我的机器人不和谐不起作用。我不知道为什么?
- flutter - 飞镖列表模型类无法显示
- json - 从 api SwiftUI 解码 JSON 文件
- python - 为什么内置模块不包含代码?