概述:前面我们把参数输入,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."