• 7597阅读
  • 9回复

守护进程 [复制链接]

上一主题 下一主题
离线lzian
 
只看楼主 倒序阅读 楼主  发表于: 2008-04-21
— 本帖被 XChinux 执行加亮操作(2008-04-21) —
linux结合qt编程中,怎么实现守护进程的编程?
也就是如何保证程序只有唯一的副本在运行?
离线XChinux

只看该作者 1楼 发表于: 2008-04-21
Linux下写守护进程,可使用daemon(int,int)函数,既fork子进程、设置组ID、输入输出重定向、改变当前目录等等。
要限制只有一个实例在运行,可使用写进程ID,既启动时将自己的进程ID写在某个文件中(比如/var/run/appName.pid),然后上锁,在程序退出时,解锁,删除文件。当要运行另一个实例的时候,读这个文件,如果存在并且里面有进程号,则表示当前有实例在运行,就自动退出,如果没有,则按正常过程启动,。。。。。。。。。。。。这是一种方法。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线lzian
只看该作者 2楼 发表于: 2008-04-21
恩,这种方法在《apue》上提到过。
只是看到MFC上可以用CREATEMUTEX函数,创建一个全局互斥量,不知道QT有没有这个功能。
离线XChinux

只看该作者 3楼 发表于: 2008-04-21
Qt solution里有关于Single Application的包,楼主可找找。
貌似其Windows版中是使用FindWindow()来实现的,如果有同名的title,那就失效了。
[ 此贴被XChinux在2008-05-08 10:52重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线lzian
只看该作者 4楼 发表于: 2008-04-22
有的,但是我用的是开源版的QT,商业版中才有single application。
只能用linux编程实现了
离线toadman
只看该作者 5楼 发表于: 2008-05-08
还有一种办法简单可行。在/proc目录下存放的是当前运行的所有进程目录,你可以遍历该目录取出你想要的进程,例如/2934/status文件中包含了该进程运行时的进程名等信息。进程在运行时,该目录一直存在,在进程完全结束后,该目录也将消失。现在搂主只需要保证/proc下仅有一个该进程运行即可!
离线lzian
只看该作者 6楼 发表于: 2008-05-08
/proc是内存文件,内存里有什么,/proc才会有什么
你说的方法还是要控制进程,我用《apue》上的daemon实现了
离线toadman
只看该作者 7楼 发表于: 2008-05-08
你的目的是保证程序只有唯一的副本在运行,在内存文件/proc下查找相同的进程名字就可以实现,不用再控制进程了,当然如果有相同名字的应用就该用到进程的控制这个方法可能就还需要改进
离线lzian
只看该作者 8楼 发表于: 2008-05-08
我明白你的意思,但是/proc下存的是以进程号命名的文件夹,不是进程名。
    进程名在相应进程的文件夹里的status文件里,如果要找名字的话,还要设计一堆文字处理的程序,方法可行但时间和空间开销都要增大许多。
    我是按照《apue》里提供的lockfile方法:创建一个文件,写入进程号,加锁;这样只有唯一的副本可以操作这个文件,其他的副本就没办法再给这个文件加锁,就ok了
离线toadman
只看该作者 9楼 发表于: 2008-05-08
嗯,的确你的这个方法要好些,我的那个思路是自己想出来的,没有用文件锁这个办法好!
快速回复
限100 字节
 
上一个 下一个