C语言编写查看程序中指定进程是否存在

 

main.c

 

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

int mousePoint();
void registerTable();
void checkProcess();
void shutdownFF();


int main(void)
{
    //鼠标模拟点击弹框
    //mousePoint();
    // 主窗体类名
    //static TCHAR szWindowClass[] = _T("long");
    // 应用程序标题栏处出现的字符串
    //static TCHAR szTitle[] = _T("long for Application");

    //隐藏窗口
    ShowWindow(GetConsoleWindow(), SW_HIDE);
    int now = 1;
    while (now) {
        //检验进程是否挂掉
        checkProcess();
        Sleep(5000);
        //定时关闭进程
        shutdownFF();
    }
    //写入注册表
    //registerTable();

    return 0;
}

int regedit(HKEY key, const char* reg_name, const char* key_name, const char* key_value)
{
    HKEY hkResult;
    int ret=RegOpenKeyEx(key, reg_name, 0, KEY_ALL_ACCESS, &hkResult);

    if(ret != 0)
        return ret;

    ret=RegSetValueEx(hkResult, key_name, 0, REG_EXPAND_SZ, (CONST BYTE*)key_value, 250);

    if(ret==0)
    {
        RegCloseKey(hkResult);
        return 0;
    }
    else
    {
        return ret;
    }
}

int autopen(const char* key_name, const char* process_path)
{
    char reg_name[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
    return regedit(HKEY_LOCAL_MACHINE, reg_name, key_name, process_path);
}

///win10需要管理员权限运行
void registerTable()
{
    char key_name[100];
    char process_path[1000];

    GetPrivateProfileStringA("Main", "KeyName", "test", key_name,  sizeof(key_name), ".\\config.ini");
    GetPrivateProfileStringA("Main", "ProcessPath", "test", process_path,  sizeof(process_path), ".\\config.ini");

    int ret = autopen(key_name, process_path);
    if(ret == 0)
    printf("write to register succeed\n");
    else
    printf("write to register failed %d \n",ret);
}

config.ini

[Main]
KeyName = longstart
ProcessPath = F:\\rtmp\checkProcess.exe

 

 

 

checkProcess.c

//
// Created by long on 2020/5/15.
//
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <tlhelp32.h>	//进程快照函数头文件
#include <stdbool.h>
#include <time.h>

void killcmd();
void killFF();

bool getProcess(const char *procressName);

void checkProcess(){

    if (getProcess("ffmpeg.exe"))
    {
        printf("存在\n");
    }
    else
    {
        printf("不存在\n");
        killcmd();
        system("cscript \"F:\\rtmp\\nginx-1.7.11.3-Gryphon\\ffmpeg-20200115-0dc0837-win64-static\\bin\\start.vbs\"");
    }

}


void shutdownFF(){
    struct tm *ptr;
    time_t lt;
    time(&lt);//当前系统时间
    ptr=localtime(&lt);//获取本地日历时间指针
    int myHour = ptr->tm_hour;//输出24H下的小时数
    int myMinutes = ptr->tm_min;
    int mySeconds = ptr->tm_sec;
    if(myHour == 5 && myMinutes ==0 && (mySeconds == 0||mySeconds == 1||mySeconds == 2||mySeconds == 3 || mySeconds == 4)){
        killcmd();
        killFF();
    }
}


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;
}

void killFF(){
    system("tasklist |findstr /c:\"ffmpeg.exe\" | taskkill /f /im \"ffmpeg.exe\"");
}

void killcmd(){
    system("tasklist |findstr /c:\"cmd.exe\" | taskkill /f /im \"cmd.exe\"");
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux下使用C语言创建进程池,可以按照以下步骤: 1. 创建进程池结构体,用于存储进程池相关信息,如进程池大小、当前已有进程数、互斥锁等。 2. 在主进程创建进程池,即创建一定数量的子进程,将它们放入进程。 3. 当有任务需要处理时,主进程进程取出一个空闲进程,将任务分配给它处理。 4. 子进程在处理完任务后,将自己标记为空闲状态,然后等待下一次任务分配。 以下是一个简单的进程池实现示例: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <pthread.h> #define MAX_PROCESS_NUM 10 #define MAX_TASK_NUM 100 typedef struct { pid_t pid; int is_busy; } Process; typedef struct { pthread_mutex_t lock; Process *process_list; int process_num; int task_num; } ProcessPool; int create_process_pool(int num, ProcessPool *pool); int destroy_process_pool(ProcessPool *pool); int process_task(ProcessPool *pool); int main() { ProcessPool pool; if (create_process_pool(MAX_PROCESS_NUM, &pool) == -1) { printf("Failed to create process pool.\n"); exit(1); } // 处理任务 for (int i = 0; i < MAX_TASK_NUM; i++) { process_task(&pool); } if (destroy_process_pool(&pool) == -1) { printf("Failed to destroy process pool.\n"); exit(1); } return 0; } int create_process_pool(int num, ProcessPool *pool) { pool->process_num = num; pool->process_list = malloc(num * sizeof(Process)); if (pool->process_list == NULL) { return -1; } // 初始化互斥锁 pthread_mutex_init(&pool->lock, NULL); // 创建子进程 for (int i = 0; i < num; i++) { pid_t pid = fork(); if (pid == -1) { return -1; } else if (pid == 0) { // 子进程 while (1) { // 等待任务 pthread_mutex_lock(&pool->lock); for (int j = 0; j < pool->process_num; j++) { if (pool->process_list[j].pid == getpid()) { pool->process_list[j].is_busy = 0; break; } } pool->task_num--; pthread_mutex_unlock(&pool->lock); // 处理任务 printf("Process %d is processing task %d.\n", getpid(), MAX_TASK_NUM - pool->task_num); sleep(1); // 标记为空闲状态 pthread_mutex_lock(&pool->lock); for (int j = 0; j < pool->process_num; j++) { if (pool->process_list[j].pid == getpid()) { pool->process_list[j].is_busy = 0; break; } } pthread_mutex_unlock(&pool->lock); } } else { // 父进程 pool->process_list[i].pid = pid; pool->process_list[i].is_busy = 0; } } // 初始化任务数 pool->task_num = MAX_TASK_NUM; return 0; } int destroy_process_pool(ProcessPool *pool) { // 等待子进程退出 for (int i = 0; i < pool->process_num; i++) { waitpid(pool->process_list[i].pid, NULL, 0); } // 释放资源 free(pool->process_list); pthread_mutex_destroy(&pool->lock); return 0; } int process_task(ProcessPool *pool) { // 找出空闲进程 int index = -1; pthread_mutex_lock(&pool->lock); for (int i = 0; i < pool->process_num; i++) { if (!pool->process_list[i].is_busy) { pool->process_list[i].is_busy = 1; index = i; break; } } pthread_mutex_unlock(&pool->lock); if (index == -1) { // 进程池已满,等待空闲进程 sleep(1); process_task(pool); } else { // 分配任务 printf("Task %d is assigned to process %d.\n", MAX_TASK_NUM - pool->task_num, pool->process_list[index].pid); pool->task_num--; } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值