service启动的进程无法获取进程创建的mutex

当一个进程被某个service启动后,他的启动用户为system,如果这个进程是希望单实例运行的,判断如下


hMutex = CreateMutex(NULL, FALSE, "Name");

if( GetLastError == ERROR_ALREADY_EXISTS)

{

  已经存在运行实例

}


如果启动这个进程的是普通用户,比如administrator,那么在执行到CreateMutex时,GetLastError返回的是ERROR_ACCESS_DENIED,被禁止访问,hMutex返回0,这个时候将对启动多个实例了。

是否做ERROR_ACCESS_DENIED判断???



可以如下方式建立Mutex,可以避免以上问题。

var
  hMutex: THandle;
  sa: _SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
begin
  InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
  SetSecurityDescriptorDacl(@sd, True, nil, False);
  sa.nLength := SizeOf(_SECURITY_ATTRIBUTES);
  sa.bInheritHandle := True;
  sa.lpSecurityDescriptor := @sd;
  hMutex := CreateMutex(@sa, False, PChar('name'));

end;

SYSTEM下建立的默认描述符普通用户无法访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值