基于LINUX下的多线程
Posted tangbolibao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于LINUX下的多线程相关的知识,希望对你有一定的参考价值。
基于Linux下的多进程fork详解
前言:
在学习C/C++的路上,想要更精进知识面和深度,多线程进程等知识点是一定要掌握的,是高并发服务器和TCP socket编程的必经之路,下面由博主带来fork()函数创建多进程的详解;
fork函数
作用: 创建子进程 原型: pid_t fork(void) 函数参数: 无 返回值:
调用成功:父进程返回子进程的PID(子进程id号),子进程返回0
调用失败:返回-1,需要设置errno值。
父进程调用fork函数创建一个子进程,子进程的用户区和父进程的用户区完全一样,但是内核区完全不一样,就比如说父进程和子进程的PID就不一样。
在linux终端下输入 man fork 会查到fork函数的详解
意思为创建子进程。
pid_t fork(void)
1.fork函数的返回值?
父进程返回是子进程的PID,这个值肯定是>0; 子进程返回的是0; 注意:并不是一个进程返回两个值,而是由父子进程各自返回一个值
2.父子进程的执行逻辑:
父进程执行pid>0的逻辑,子进程执行pid==0的逻辑;
2.父子进程谁先执行?
程序执行来看是随机执行,但是从根上来看是谁先抢到cpu时间片谁先执行
fork代码的示例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
//创建子进程
pid_t pid=fork();
//创建失败,,打印错误
if(pid<0)
{
perror("fork error");
return -1;
}
//父进程
else if(pid>0)
{
printf("father: pid==[%d],fpid==[%d]\\n",getpid(),getfppid());
sleep(1);
}
//子进程
else if(pid==0)
{
printf("child:pid=[%d],fpid==[%d]\\n",getpid(),getppid());
}
return 0;
}
运行代码如下::::::
![代码
父进程的进程id为5147,创建的子进程为5148,5148的父进程又是5147;
而进程2433我们可以通过 终端指令下 ps -ef |grep 2433查看
循环创建子进程注意点
我们对上面的代码进行改造,改造成循环三次创建子进程,代码如下
//循环创建n个子进程
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
int i=0;
for(i=0;i<3;i++)
{
//创建子进程
pid_t pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}
//父进程
else if(pid>0)
{
printf("father: pid==[%d],fpid=[%d]\\n",getpid(),getppid());
sleep(1);
}
//子进程
else if(pid==0)
{
printf("child:pid=[%d],fpid=[%d]\\n",getpid(),getppid());
}
}
}
如果这样,,表面上是创建了三个子进程,实际上是创建了7个,原因如下
当i = 0时,父进程m创建一个子进程x1;
当i = 1时,父进程m创建一个子进程x2,同时x又创建一个子进程y1(孙子进程);
当i = 2时, 父进程m创建一个子进程x3,同时x1又创建一个子进程y2,y1也创建了子进程q1(曾孙进程),x2又创建一个子进程f2;
由图可以直观的看到总共创建的子进程为7个,算上父进程为8个,且每个子进程的父线程不一定相同,所以直接循环创建子进程方法并不正确
若我们想要创建同为兄弟的子线程只需要在创建子线程处(当pid==0的逻辑里)添加break跳出循环即可创建同级下的子进程如图所示:::
如果结果为三个子进程的父进程同为5276,成功创建。。
以上是关于基于LINUX下的多线程的主要内容,如果未能解决你的问题,请参考以下文章