C/C++ 判断进程是否存在

这段代码实现了一个函数getProcess,用于检查指定名称的进程是否存在。它通过遍历系统中的所有进程,对比输入的进程名(不区分大小写)与快照中的进程名,以判断是否存在指定进程。

  1. getProcess函数:该函数接受一个进程名(procressName)作为输入,通过调用CreateToolhelp32Snapshot函数创建一个进程相关的快照句柄。然后,使用Process32First函数获取第一个进程信息。在遍历过程中,将进程名转换为小写,并与输入的进程名进行比较。如果存在与输入名称匹配的进程,则返回true;否则继续遍历。最后,关闭快照句柄并返回false,表示未找到匹配的进程。

  2. main函数:在main函数中,调用getProcess函数并传入进程名"qq.exe"进行检查。如果存在该进程,输出"存在";否则输出"不存在"。

需要注意的是,当前进程需要具备足够的权限才能打开其他进程的快照。在实际运行时,确保以管理员权限运行或具备足够的权限以避免访问限制。

#include <windows.h>
#include <tlhelp32.h>    //进程快照函数头文件
#include <stdio.h>

bool getProcess(const char *procressName)                //此函数进程名不区分大小写
{
    char pName[MAX_PATH];                                //和PROCESSENTRY32结构体中的szExeFile字符数组保持一致,便于比较
    strcpy(pName,procressName);                            //拷贝数组
    CharLowerBuff(pName,MAX_PATH);                        //将名称转换为小写
    PROCESSENTRY32 currentProcess;                        //存放快照进程信息的一个结构体
    currentProcess.dwSize = sizeof(currentProcess);        //在使用这个结构之前,先设置它的大小
    HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的所有进程拍一个快照

    if (hProcess == INVALID_HANDLE_VALUE)
    {
        printf("CreateToolhelp32Snapshot()调用失败!\n");
        return false;
    }

    bool bMore=Process32First(hProcess,&currentProcess);        //获取第一个进程信息
    while(bMore)
    {
        CharLowerBuff(currentProcess.szExeFile,MAX_PATH);        //将进程名转换为小写
        if (strcmp(currentProcess.szExeFile,pName)==0)            //比较是否存在此进程
        {
            CloseHandle(hProcess);                                //清除hProcess句柄
            return true;
        }
        bMore=Process32Next(hProcess,&currentProcess);            //遍历下一个
    }

    CloseHandle(hProcess);    //清除hProcess句柄
    return false;
}

int main()
{
    
    if (getProcess("qq.exe"))
    {
        printf("存在\n");
    }
    else
    {
        printf("不存在\n");
    }
    return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux C中,判断进程是否存在有多种方法。其中一种常见的方法是使用kill函数来向指定进程发送一个特殊的信号,如果该进程存在则不会报错,否则会报错。具体步骤如下: 首先,我们需要获取待判断进程进程号(PID)。可以通过系统调用函数getpid()来获取当前进程的PID,或者通过其他方法获取待判断进程的PID。 接下来,我们调用kill函数来向待判断进程发送一个特殊的信号0。这个信号不会对进程产生任何影响,只是用来检测进程是否存在。如果系统调用成功返回,则表示待判断进程存在;如果系统调用返回失败并且errno等于ESRCH,则表示待判断进程不存在。 下面是一个示例代码: ```c #include <stdio.h> #include <sys/types.h> #include <signal.h> #include <errno.h> int main() { pid_t pid = 12345; // 替换为待判断进程的PID // 向待判断进程发送信号0 int result = kill(pid, 0); if (result == 0) { printf("进程存在\n"); } else if (result == -1 && errno == ESRCH) { printf("进程不存在\n"); } else { printf("判断进程存在与否时发生错误\n"); } return 0; } ``` 以上是一种常见的判断进程是否存在的方法,也可以使用其他的方法来实现,如通过读取/proc目录下的进程信息等。不同的方法适用于不同的场景,具体选择哪种方法应根据实际需求来决定。 ### 回答2: 要判断一个进程是否存在,可以使用Linux中的kill命令结合信号0来实现。 在C语言中,可以使用fork()和exec()函数来创建一个子进程,并通过判断进程的返回值来确定进程是否存在。具体过程如下: 首先,在C语言中,我们可以使用fork()函数创建一个子进程。fork()函数创建的子进程会复制父进程的所有变量和状态,并从fork()函数之后的位置继续执行。父进程和子进程会有不同的返回值,返回给父进程的是子进程进程ID,而对子进程则返回0。 进一步,在子进程中,可以使用exec()函数来执行特定的命令,这里我们可以使用exec()函数执行"ps"命令并通过管道读取输出。 然后,我们在父进程中可以使用wait()函数来等待子进程执行完毕,并检查进程的返回状态。如果子进程的返回状态为0,即执行成功,则说明该进程存在;反之,则说明该进程不存在。 最后,根据上述思路,我们可以编写一个C语言程序,实现判断进程是否存在的功能。 ```c #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> int main() { pid_t child_pid; int status; // 创建子进程 child_pid = fork(); if (child_pid == -1) { perror("Failed to fork"); exit(1); } else if (child_pid == 0) { // 子进程中 // 使用exec函数执行"ps"命令,并通过管道读取输出 execlp("ps", "ps", NULL); perror("Failed to execute ps"); exit(1); } else { // 父进程中 // 等待子进程执行完毕 wait(&status); // 检查进程的返回状态 if (status == 0) { printf("Process exists\n"); } else { printf("Process does not exist\n"); } } return 0; } ``` 以上就是通过Linux C语言判断进程是否存在的方法,通过使用fork()、exec()和wait()函数来实现。 ### 回答3: 在Linux C中,判断进程是否存在可以通过以下方法实现: 1. 使用`kill`函数和`getpid`函数结合,发送一个空信号给目标进程,若返回值为0,则表示该进程存在;否则,表示该进程不存在。 ```c #include <signal.h> #include <unistd.h> int isProcessExist(pid_t pid) { return (kill(pid, 0) == 0); } int main() { pid_t targetPid = <目标进程的PID>; if (isProcessExist(targetPid)) { printf("该进程存在\n"); else { printf("该进程不存在\n"); } return 0; } ``` 2. 使用`kill`函数和`waitpid`函数结合,尝试向目标进程发送一个0信号,若返回值为0,则表示该进程存在;否则,表示该进程不存在。 ```c #include <signal.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int isProcessExist(pid_t pid) { int status; return (waitpid(pid, &status, WNOHANG) == 0); } int main() { pid_t targetPid = <目标进程的PID>; if (isProcessExist(targetPid)) { printf("该进程存在\n"); else { printf("该进程不存在\n"); } return 0; } ``` 以上两种方法都是通过向目标进程发送信号并观察返回值来判断进程的存在性。第一种方法是通过发送空信号,若返回值为0表示成功,即进程存在。第二种方法是通过`waitpid`函数,在非阻塞模式下尝试等待进程结束,若返回值为0表示成功,即进程存在。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值