【Linux】进程概念 —— fork函数

本文详细介绍了fork函数的概念、用法和原理,包括它如何创建子进程,为何会有两个返回值,以及在实际应用中的使用。通过示例代码解释了fork函数如何让父子进程执行不同代码,并探讨了多次fork产生的进程数量规律。同时,提出了关于返回值如何在同一变量中记录两次的问题,为后续学习埋下伏笔。

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

目录

一.概念

二.解释

1.现象与原理

2.fork函数的用法

3.fork函数为什么会有两个返回值

4.扩展问题


一.概念

本质:fork函数是一个system call,也就是系统调用

作用:创建子进程

参数:无参

返回值

        1.类型是pid_t,本质就是int类型

        2.创建失败:返回-1;

           创建成功:有两个返回值,给父进程返回子进程的pid,给子进程返回0

包含头文件:unistd.h

二.解释

1.现象与原理

2.fork函数的用法

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

int main()
{ 
  pid_t id = fork();

  if(id < 0)//fork创建子进程失败
  {
    perror("fork");//打印错误信息
    exit(0);//结束进程
  }
  else if(id == 0)//执行子进程代码
  {
    //...
    //例如
    while(1)
    {
      printf("This is Son Process, ret:%d, pid:%d, ppid:%d\n",id,getpid(),getppid());
      sleep(1);
    }
  }
  else//执行父进程代码
  {
    //...
    //例如
    while(1)
    {
      printf("This is Parent Process, ret:%d, pid:%d, ppid:%d\n",id,getpid(),getppid());
      sleep(1);
    }
  }
  return 0;
}

可以看到else if 与 else的代码同时执行了!

两个while死循环同时执行了!!

为什么会这样?

就是因为这是两个进程,两个共享fork之后的代码,但独立运行,互不干扰

此外,这里在实际应用中就用fork返回值id分别让父子进程执行不同的代码

但是有人问父子进程代码在fork之后不是共享的吗?

答:是共享的,共享与能执行是两回事,父子进程彼此能看到对方的代码,但是能执行的代码被返回值分开了

3.fork函数为什么会有两个返回值

为什么给子进程返回0,为什么给父进程返回子进程的pid?

答:每个父亲可以有多个孩子,但每个孩子只会有一个父亲,所以父亲需要给孩子起名字来标识这个孩子

为什么fork函数有两个返回值,难道之前学的函数只有一个返回值不对吗?

答:函数有且仅有一个返回值,这一结论是肯定的!

那么为什么fork有两个返回值?

当前阶段,只能先简单认识一下。

但是这里有遗留问题!!!

返回两次,不代表会被记录两次,同一个变量:id,怎么会能同时记录两个数据呢?

这个问题在后面的博客中会给出解释,目前为止理解到这里就可以了

4.扩展问题

fork一次,创建一个子进程,一共有两个进程

那么fork两次,fork三次,fork四次,一共有多少个进程??

对于这个问题,先画出一张图,就可以很容易的解释了。

总结规律:n次fork一共会有2^n个进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值