背景
项目中想使用多进程的模式。一个控制进程,加上N个工作进程。即是master+worker进程的模式,与nginx的进程模式类似的思路。master创建并管理worker进程,而且他们之间需要能够进行通信。设计思路如下图所示:
遇到问题
如何创建woker进程
linux系统下,创建进程,肯定使用fork来做系统调用。然后fork之后,我们通过ps看到子进程名称也是master,从使用角度来看,并不是很舒服。
子进程如何修改进程名称为worker
方案一:
使用prctl(PR_SET_NAME, “process_name”, NULL, NULL, NULL); 但自己尝试多次未能修改成功,具体原因未找到,待后续研究 。
方案二:
使用exec函数,用新的可执行文件替换当前进程。测试可行。
master如何与worker通信
socketpair通信方式
对于父子进程,如果需要双向通信的话,可以考虑管道或者socket。
1、管道因为父子进程只能单向通信,需要开两条管道进行双向通信,比较麻烦。
2、可以使用socketpair来创建一对通信socket。fork之后,因为子进程继承了父进程的文件描述符。可参考如下示例代码进行创建socketpair通信:
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <error.h>
#include <errno.h>
#include <sys/socket.h>
const char* str = "SOCKET PAIR TEST\n";
int main(int argc, char** argv) {
bool is_worker = false;
if (argc == 2) {
printf("child process here, pid[%d]\n", getpid());
is_worker = true;
}
char buf[128] = {
0};
pid_t pid;
int socket_pair[2];
if (is_worker) {
printf("socket_pair[0] is [%d], socket_pair[1] is [%d]\n",
socket_pair[0], socket_pair[1]);
printf("try to hard code socket[0] is 3\n");
read(3, buf, sizeof(buf));
printf("Read result: %s, pid: %d\n",buf, getpid