fork生成子进程与执行exec子进程的区别

背景

项目中想使用多进程的模式。一个控制进程,加上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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值