基于LINUX下的多线程

基于Linux下的多进程fork详解

前言:
在学习C/C++的路上,想要更精进知识面和深度,多线程进程等知识点是一定要掌握的,是高并发服务器和TCP socket编程的必经之路,下面由博主带来fork()函数创建多进程的详解;

fork函数

作用: 创建子进程 原型: pid_t fork(void) 函数参数: 无 返回值:
调用成功:父进程返回子进程的PID(子进程id号),子进程返回0
调用失败:返回-1,需要设置errno值。

父进程调用fork函数创建一个子进程,子进程的用户区和父进程的用户区完全一样,但是内核区完全不一样,就比如说父进程和子进程的PID就不一样。

在linux终端下输入 man fork 会查到fork函数的详解
基于LINUX下的多线程_第1张图片
意思为创建子进程。

pid_t fork(void)
1.fork函数的返回值?

父进程返回是子进程的PID,这个值肯定是>0; 子进程返回的是0; 注意:并不是一个进程返回两个值,而是由父子进程各自返回一个值

2.父子进程的执行逻辑:

父进程执行pid>0的逻辑,子进程执行pid==0的逻辑;

2.父子进程谁先执行?

程序执行来看是随机执行,但是从根上来看是谁先抢到cpu时间片谁先执行

fork代码的示例

#include
#include
#include
#include
#include
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;
}

运行代码如下::::::

![代码基于LINUX下的多线程_第2张图片
父进程的进程id为5147,创建的子进程为5148,5148的父进程又是5147;
而进程2433我们可以通过 终端指令下 ps -ef |grep 2433查看
基于LINUX下的多线程_第3张图片

循环创建子进程注意点

我们对上面的代码进行改造,改造成循环三次创建子进程,代码如下

//循环创建n个子进程
#include
#include
#include
#include
#include
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;
基于LINUX下的多线程_第4张图片
由图可以直观的看到总共创建的子进程为7个,算上父进程为8个,且每个子进程的父线程不一定相同,所以直接循环创建子进程方法并不正确
基于LINUX下的多线程_第5张图片
若我们想要创建同为兄弟的子线程只需要在创建子线程处(当pid==0的逻辑里)添加break跳出循环即可创建同级下的子进程如图所示:::
基于LINUX下的多线程_第6张图片
如果结果为三个子进程的父进程同为5276,成功创建。。

你可能感兴趣的:(C语言,c语言,linux,多进程)