首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个应用程序实例,与平台无关,C++11

一个应用程序实例,与平台无关,C++11
EN

Stack Overflow用户
提问于 2014-09-16 09:06:23
回答 2查看 1.4K关注 0票数 4

在C++11中是否有一种独立于平台的方法(boost是可用的)来确保一次只启动一个应用程序的一个实例?(我不喜欢使用"file and (f)lock“方法运行,因为它需要特定于平台的代码,但是如果没有更好的方法,我会这样做的。)

在我的场景中,没有(简单的)其他方法,比如不可用的端口,我也可以使用它作为标准。是的,我知道DOS的问题--所以没有必要指出这些问题。

我发现了以下类似的问题,建议使用带有boost的解决方案。但是,解决方案有两个问题:

  • 小调:似乎没有打给shared_memory_object::remove("shared_memory");的电话(在“比赛赢了”的情况下)。但是我对boost::interprocess不是很熟悉,所以我可能错了?!
  • 梅杰:如果程序崩溃,共享内存仍然存在,因此程序的下一个实例将无法启动。

我还找到了这个问题。没有回答让我兴奋。但是这是一个C++98问题,所以也许用C++11或者boost,现在有一种新的/不同的方式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-16 10:16:29

你可以做基于boost的平台无关文件锁定

锁定文件或它自己的可执行文件

票数 4
EN

Stack Overflow用户

发布于 2014-09-17 09:18:46

您可以绑定到某个端口,例如,使用ASIO:

代码语言:javascript
复制
#include <iostream>
#include <boost/asio/ip/udp.hpp>
#include <boost/asio/io_service.hpp>

int main()
{
    boost::asio::io_service io;
    boost::asio::ip::udp::socket sock(io);
    sock.open(boost::asio::ip::udp::v4());
    boost::system::error_code ec;
    sock.bind({boost::asio::ip::udp::v4(), /*your port here*/}, ec);
    if (ec)
        std::cout << "Not mine\n";
    else
        std::cout << "It's mine\n";
    return 0;
}

如果它成功了,那么它是第一个应用程序,否则它已经在运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25864725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档