直接上代码
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sched.h>
#include <stdint.h>
typedef void (*spawn_proc_pt) (void *data);
static void worker_process_cycle(void *data);
static void start_worker_process(int n);
pid_t spawn_process(spawn_proc_pt proc, void *data, char *name);
int main(int argc, char** argv )
{
start_worker_process(2);
//管理子进程
wait(NULL);
}
void start_worker_process(int n)
{
int i = 0;
for(i = 0; i < n; ++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_set_t cpu_affinity;
//多核高并发处理 2core 0 - 0 1 -1
CPU_ZERO(&cpu_affinity);// 清空
CPU_SET(worker % CPU_SETSIZE, &cpu_affinity);//1 % 2 = 1
if(sched_setaffinity(0, sizeof(cpu_set_t), &cpu_affinity) == -1)//if 1 -> cpu 1
{
fprintf(stderr, "sched_setaffinity() failed\n");
}
}
void worker_process_cycle(void* data)
{
int worker = (intptr_t)data;
//初始化
worker_process_init(worker);
//doing
while(1)
{
sleep(10);
printf("pid %ld, doing ...\n", (long int)getpid());
}
}
运行....
分析: 嗯嗯.... 有问题, 我创建了两个子进程, 为什么先调用printf(), 而不是去处理函数?
思路: 可能是因为在创建子进程时,父进程没有等待子进程执行完毕就返回了。在创建子进程后,父进程会继续执行下面的代码,而不会等待子进程完成。因此,子进程可能会在父进程返回后立即执行.
解决方案:创建子进程后使用wait()或waitpid()等函数等待子进程执行完毕.