Linux多进程绑定cpu亲缘并发处理

/****************************************
* 多进程绑定cpu亲缘
* 查看进程在cpu的哪个核上运行 的命令: ps -eLo ruser,pid,lwp,psr,args | grep 程序名.exe
* killall 程序名.exe  干掉这个程序所有的进程
* kill -9 进程id 干掉某个进程
* ps -ef | grep 程序名.exe 产科这个程序的所有进程包括父进程如果不是父进程那么就是爷爷进程默认进程id是1
*******************************************/

#define _GNU_SOURCE//设置cpu亲缘所需的宏
#include <sched.h>//cpu亲缘
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>

typedef void (*spawn_proc_pt) (void *data);//函数指针指向子进程所执行的函数
static void worker_process_cycle(void *data);//子进程执行的函数
static void start_worker_processes(int n);//批量创建子进程
pid_t spawn_process(spawn_proc_pt proc, void *data, char *name); //创建子进程

int main(int argc,char **argv){
    
    
start_worker_processes(4);//建立4个子进程








//管理子进程
/*************************
*添加管理子进程的代码
*
*
*
**************************/





    wait(NULL);//等待子进程结束
}

void start_worker_processes(int n)//批量创建子进程
{
    
    
    int i=0;
    for(i = n - 1; i >= 0; i--){
    
    
       spawn_process(worker_process_cycle,(void *)(intptr_t) i, "worker process");
    }
}

pid_t spawn_process(spawn_proc_pt proc, void *data, char *name)//创建子进程
{
    
    

    pid_t pid;
    pid = fork();

    switch(pid){
    
    
    case -1:
        fprintf(stderr,"fork() failed while spawning \"%s\"\n",name);
        return -1;
    case 0:
          proc(data);
          return 0;
    default:
          break;
    }   
    printf("start %s %ld\n",name,(long int)pid);
    return pid;
}


static void worker_process_init(int worker)//绑定cpu亲缘
{
    
    
    cpu_set_t cpu_affinity;//cpu的掩码数据结构     Linux查看核数 :cat /proc/cpuinfo
    //worker = 2;
	//多核高并发处理  4core  0 - 0 core 1 - 1  2 -2 3 -3  
    CPU_ZERO(&cpu_affinity);//cpu掩码清空
    CPU_SET(worker % CPU_SETSIZE,&cpu_affinity);// cpu亲缘设置掩码对应进程    CPU_SETSIZE表示cpu最大的数量
    //sched_setaffinity
    if(sched_setaffinity(0,sizeof(cpu_set_t),&cpu_affinity) == -1)//绑定cpu亲缘
	{
    
    
       fprintf(stderr,"sched_setaffinity() failed\n");
    }
}

void worker_process_cycle(void *data)//子进程干活
{
    
    
     int worker = (intptr_t) data;
    //初始化
     worker_process_init(worker);

    //干活
    for(;;){
    
    
      sleep(10);
      printf("pid %ld ,doing ...\n",(long int)getpid());
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45743563/article/details/113742483
今日推荐