我正在寻找一个简单的事件通知系统:
处理 A 阻塞,直到它得到通知...
进程 B,它触发进程 A。
如果我在 Win32 中这样做,我可能会使用事件对象('A' 块,当 'B' 执行 SetEvent 时)。我需要一些非常快速和肮脏的东西(更喜欢脚本而不是 C 代码)。你会建议什么样的事情?我想知道文件咨询锁,但它看起来很乱。其中一个进程必须主动打开文件才能持有锁。
又快又脏?
然后使用fifo。它是一个命名管道。进程A以阻塞模式从fifo的FD中读取。进程 B 在需要时写入它。
确实很简单。
这是 bash 脚本实现:
方案一:
#!/bin/bash
mkfifo /tmp/event
while read -n 1 </tmp/event; do
echo "got message";
done
方案 B:
#!/bin/bash
echo -n "G" >>/tmp/event
首先启动脚本 A,然后在另一个 shell 窗口中重复启动脚本 B。
又慢又干净?
然后使用(命名)信号量:POSIX 或 SysV(不推荐,但可能更便携)。进程 A 执行 a sem_wait
(or sem_timedwait
) 并且进程 B 调用sem_post
。
除了 fifo 之外,您还可以使用 signal 和 kill 来进行中断并让一个进程休眠,直到它接收到像 SIGUSR1 这样的信号,然后解除阻塞(您可以使用条件变量轻松实现此目的而无需轮询)。