linux c 创建进程

fork()
pid_t fork();
返回值:新创建进程的进程ID,0表示子进程,其他大于0的数表示父进程,负数表示失败

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{

   pid_t pid;
   pid = getpid();
   printf("parentpid = %d\n",pid);
  
   pid = fork();
   if(pid<0){
      printf("fork error\n");
      return 0;
   }
   if(0==pid){
       printf("this is child, pid = %d\n",getpid());
       sleep(20);
   }else{
       printf("this is parent, pid = %d,child pid=%d \n",getpid(),pid);  
       sleep(20);
   }
   return 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、付费专栏及课程。

余额充值