Webbench源码分析之多进程(三)

本文详述了Webbench源码中的多进程创建、无名管道通信及信号处理。通过实例分析fork函数的工作原理,探讨pipe()如何实现父子进程间的通信,并讨论了在实际使用中可能存在的小问题。同时,介绍了sigaction函数在处理信号时的角色。通过阅读Webbench源码,学习了将子进程用于处理任务,父进程负责统计的架构设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:前面我们把参数输入,http协议以及socket客户端编程部分都说了,今天就把多进程这一块内容学习过程记录一下。同时今天学习的这一部分也是webbench的核心部分了。

知识点:
1,多进程的创建。
2,多进程无名管道pipe通信。
3,多进程信号。

还是老样子,在学习源码之前先把用到的知识点搞懂,然后再进行学习,这样就事半功倍了。

1,多进程的创建
说到多进程,那fork()函数是跑不掉了,我这里也就简单说一下啦。fork函数就是一个创建子进程的作用,它的返回值有三种情况。
1,小于0,失败。
2,等于0,表示当前运行进程为子进程,返回值是0。
3,大于0,表示当前运行进程为父进程,返回值是子进程的进程id。

一个简单例子解释一下fork函数。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

 int value = 100;

 int main()
 {
     pid_t pid;
     printf("start\n");
     /*创建子进程*/
     pid = fork();
     printf("hahaha\n");
     /*判断是否创建失败*/
     if (pid < 0) {
         printf("fork failed\n");
         return -1;
     }
     /*返回值大于0,表示父进程*/
     if (pid > 0) {
         printf("parent process value = %d\n",value);
         sleep(1);
     }
     /*返回值等于0,表示子进程*/
     if (0 == pid) {
         value = 99;
         printf("child process value = %d\n",value);
     }
     return 0;
  }

我们看一下运行结果:
这里写图片描述

首先我们看到start打印了一次,而hahaha打印了两次。不是说子进程和父进程是完全一样的,为何start只打印出一次,这就要说子进程执行位置了,确实子进程会完全拷贝父进程,但是子进程开始执行的顺序是fork以后,所以hahaha就会打印两次了。其次,我们发现返回值大于0的执行代码运行了,等于0的执行代码也运行了,其实就是父子进程都开始运行fork之后的代码,而父进程的返回值大于0,所以打印出parent process value = 100,子进程也运行相同的代码,但是其返回值为0,所以就打印了child process value = 100.最后,我们看到value是我们之前定义的全局变量,子进程中改变了value值,父进程值还是100,其实这两个值已经不相干了,他们是独立的,不会互相影响,不像多线程需要加锁等同步机制。
关于fork()函数面试题也很多,可以看下这篇博客

2,多进程无名管道pipe通信。
这里我就用个人理解来说一下pipe()函数。管道通信,我们的pipe()是只能在有亲缘关系的进程间完成通信。比如父子进程,兄弟进程。我把webbench中用到的pipe相关代码抠出来。

int mypipe[2];
/* create pipe */
if(pipe(mypipe))
 {
     perror("pipe failed."
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值