如何将一个程序的1个实例作为一个进程运行?或者,如何测试正在运行的程序的存在?
便携式方法是优选的。
可以测试(命名的)管道的可写性,并通过适当的编程来测试正在运行的程序实例的存在性。
假设我们保留一个文件名/tmp/fifo-myapp
作为FIFO文件的名称(应为每个不同的应用程序自定义;它通常驻留在一些特定于应用程序的文件夹中,并指定为绝对路径):
文件1: test-wr-fifo
#!/bin/sh
# invocation: test-wr-fifo <timeout>
timeout="${1:=3}"
if ! [ -p "/tmp/fifo-myapp" ] ; then
rm -f "/tmp/fifo-myapp"
mkfifo "/tmp/fifo-myapp"
fi
{ sleep "$timeout" ; kill -s 0 $$ && kill -s TERM $$ ; } &
exec 3>"/tmp/fifo-myapp"
当FIFO未打开且已达到指定的超时时间时,该程序将以不成功的状态退出。
文件2: single-inst-prog
#!/bin/sh
exec 3<"/tmp/fifo-myapp"
### Application Code ###
这是我们只需要1个实例的程序。
调用single-inst-prog
:
./test-wr-fifo || ./single-inst-prog &
此方法之所以有效,是因为FIFO一端的打开会阻塞(当O_NONBLOCK清零时),直到另一端也打开为止。此方法之所以有效,是因为我们没有从FIFO读取任何数据或向FIFO写入任何数据,因此永远不会发出EOF条件和SIGPIPE信号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句