C++中实现控制当前系统中进程唯一存在

介绍

       软件开发过程中常常有这样的需求,及软件在当前系统中是唯一存在的,禁止存在多个相同的进程;这里就需要在软件启动时对当前系统中存在的进程进行排查,若已经存在,就禁止其再次启动,若没有,即可以正常启动。


CreateMutex()

        计算机自带函数,主要用于找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
BOOL bInitialOwner, // 初始化互斥对象的所有者
LPCTSTRl pName // 指向互斥对象名的指针
);
说明
  1. 返回值:如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。如果返回的是一个有效句柄,但指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS,bInitialOwner的值将会被忽略。如果调用者限制了权限,GetLastError将会返回ERROR_ACCESS_DENIED,这个时候应该使用OpenMutex函数。
  2. 参数列表:
    (1).lpMutexAttributes ,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As lpMutexAttributes ,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As
    Long,并传递零值),表示使用不允许继承的默认描述符; lpMutexAttributes
    ,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As
    Long,并传递零值),表示使用不允许继承的默认描述符;
    (2).bInitialOwner BOOL,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有
    (3).lpName String,指定互斥体对象的名字

一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象。线程句柄是一种内核对象,系统维护着每一个内核对象,当每个内核对象引用记数为0时,系统就从内存中释放该对象,CloseHandle就是将该线程对象的引用记数减1。所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。

实例:

#include "stdafx.h"
#include "windows.h"
 
int main(int argc, char* argv[])
{
    HANDLE m_hMutex = CreateMutex(NULL,TRUE,TEXT("testapp"));//输出文件名
    DWORD dwRet = GetLastError();
    if (m_hMutex)
    {
        if (ERROR_ALREADY_EXISTS == dwRet)
        {
            printf("程序已经在运行中了,程序退出!\n");
            CloseHandle(m_hMutex);
            return 0;
        }
    }
    else
    {
        printf("创建互斥量错误,程序退出!\n");
        CloseHandle(m_hMutex);
        return 0;
    }
    while(1)
    {
    }
    CloseHandle(m_hMutex);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用操作系统进程管理工具来遍历服务进程。在 Linux ,你可以使用 ps 命令来列出当前系统进程。你还可以使用 grep 命令来搜索某个关键词,以筛选出特定的进程。例如,你可以使用以下命令来查看所有以 "httpd" 开头的进程: ``` ps aux | grep "httpd" ``` 在 Windows ,你可以使用任务管理器来查看和管理进程。你也可以使用命令行工具,如 tasklist 和 netstat 等,来查看和管理进程。 如果你想要编写代码来遍历服务进程,你可以使用操作系统提供的 API 来获取进程列表,然后通过遍历列表来实现。例如,在 Python ,你可以使用 os 模块的 os.popen() 函数来执行系统命令,然后通过处理命令的输出来获取进程信息。 希望这对你有帮助。 ### 回答2: 遍历服务进程是指通过某种方法,逐个查看正在运行的服务进程。在Windows操作系统,我们可以使用Task Manager(任务管理器)以及命令行工具等来实现。 使用Task Manager遍历服务进程非常简单。首先,我们可以通过快捷键Ctrl+Shift+Esc来打开Task Manager。在Task Manager的“进程”选项卡,可以看到当前正在运行的所有进程。要查看服务进程,可以点击“服务”选项卡,然后在列表浏览和查看各个服务进程。通过Task Manager,我们可以查看服务进程称、PID(进程ID)、CPU使用率、内存占用情况等信息。 除了Task Manager,我们还可以使用命令行工具来遍历服务进程。一个常用的命令是tasklist(任务列表),它可以列出系统所有正在运行的进程,包括服务进程。在命令提示符下输入“tasklist”命令,即可显示所有进程的信息。通过查看任务列表,我们可以找到所需的服务进程,了解它们的进程ID等详情。 需要注意的是,遍历服务进程需要具有管理员权限。在打开Task Manager或运行命令时,请确保使用管理员身份运行。 总之,无论是通过Task Manager还是命令行工具,遍历服务进程都是一项简单而重要的操作,它可以帮助我们了解正在运行的服务进程,并能够对其进行管理和优化。 ### 回答3: 遍历服务进程是指通过一定的方法或工具,对正在运行的服务进程进行遍历和查看。在Windows操作系统,可以使用任务管理器来遍历服务进程。 首先,打开任务管理器。可以通过在任务栏上右键点击任务栏空白处,然后选择“任务管理器”来打开。或者可以使用组合键Ctrl+Shift+Esc来直接打开任务管理器。 在任务管理器界面,选择“服务”选项卡。这个选项卡会列出当前正在运行的所有服务进程。 在服务选项卡,可以看到每个服务进程称、描述、PID(进程标识符)、状态和用户等信息。称表示服务的具体称;描述描述了服务的功能和作用;PID是系统给每个进程分配的唯一标识符;状态表示服务进程是正在运行、已停止还是正在停止;用户表示运行该服务进程的用户账户。 可以通过点击列标题,对服务进程进行排序,方便查看和管理。例如,点击“称”列标题可以按照称的字母顺序对服务进程进行排序。 另外,还可以通过右键点击某个服务进程,选择“结束任务”来停止该服务进程的运行。但要注意,结束某个服务可能会导致系统功能的异常或其他问题,所以在操作前请确认。 通过以上方法,就可以方便地遍历和查看当前正在运行的服务进程,对于了解系统运行情况、管理和维护电脑都有一定的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值