第二人生的源码分析(七十六)判断程序运行多个实例

随着多任务系统的流行,可以轻易地把同一个程序同时运行多个实例,这对于一般的应用程序来说,是非常有用的,也大大地提高电脑的使用率。但是对于像第二人生这样的游戏来说,运行多个实例,是不需要的,也是不现实的。因为它需要非常多的 CPU计算,独占CPU还不够用,别说运行多个实例了,并且它是全屏运行的游戏,多个程序运行也不必要。那么第二人生里是使用什么方法来实现跨平台的多个实例运行的检测呢?下面就来看看这段代码:
#001 bool LLAppViewer::anotherInstanceRunning()
#002 {
#003     // We create a marker file when the program starts and remove the file when it finishes.
#004     // If the file is currently locked, that means another process is already running.
#005 
 
获取作标记文件的路径和名称。
#006     std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME);
#007     llinfos << "Checking marker file for lock..." << llendl;
#008 
 
用只读的方式打开文件。
#009     //Freeze case checks
#010     apr_file_t* fMarker = ll_apr_file_open(marker_file, LL_APR_RB);    
打开文件成功,说明已经存在这个文件,如果不存在文件,肯定就不存在多个实例了。
#011     if (fMarker != NULL)
#012     {
 
说明文件已经存在,先把只读方式的文件关闭。
#013         // File exists, try opening with write permissions
#014         apr_file_close(fMarker);
 
用写的方式打开这人文件。
#015         fMarker = ll_apr_file_open(marker_file, LL_APR_WB);
 
如果这样打开文件不成功,说明已经有一个实例已经运行,因为前一个实例用只写的方式打开文件的。
#016         if (fMarker == NULL)
#017         {
#018             // Another instance is running. Skip the rest of these operations.
#019             llinfos << "Marker file is locked." << llendl;
 
打开文件不成功,说明已经有一个实例运行。
#020             return TRUE;
#021         }
 
下面锁住这个文件,不允许再用写的方式打开。
#022         if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) //flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
#023         {
#024             apr_file_close(fMarker);
#025             llinfos << "Marker file is locked." << llendl;
#026             return TRUE;
#027         }
#028         // No other instances; we'll lock this file now & delete on quit.
 
用写的方式能打开文件,说明没有另外的实例运行。
#029         apr_file_close(fMarker);
#030     }
#031     llinfos << "Marker file isn't locked." << llendl;
#032     return FALSE;
#033 }
 
上面这段代码是通过使用一个不共享写文件的方法来判断是否已经存在另外一个实例,这就是第二人生跨平台检测是否有第二个实例运行的方法。
 

转载于:https://www.cnblogs.com/ajuanabc/archive/2008/05/30/2464071.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值