对 fork 函数的理解

举报
Linux猿 发表于 2021/10/24 11:06:08 2021/10/24
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬 


这里先说一下为什么用fork:

例如:Web服务器,当许多浏览器来访问的时候,如果服务器等一个处理完再处理另一个,那这样就太慢了,服务器可以为每一个请求开一个进程,这样就实现了多进程,提高处理速度。
例如:有一个大工程,可以分为许多个模块,就可以为每一个模块创建一个线程,当然有的模块之间有先后顺序,这可以进行特殊处理。
1. 概念:

    fork是在Linux中使用的一个分叉函数。若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记,出错则返回-1。可以把父进程和子进程的关系看做一个链表,父进程指向子进程,子进程如果还有子进程就再指向子进程,否则为空。

2. 特性:

每个进程都有一个非负整数表示的唯一进程ID;
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程;
3. 特殊进程:

ID为0的是调度进程,该进程是内核的一部分,不执行任何磁盘上的程序 ;
ID为1的是Init进程,init通常读取与系统有关的初始化文件(/etc/rc*文件、/etc/inittab文件、/etc/init.d/中的文件) ;
ID为2的是页守护进程,负责支持虚拟存储器系统的分页操作;
常用的操作函数:

#include <unistd.h>     //头文件
pid_t getpid(void);     //返回调用进程的ID
pid_t getppid(void);    //当前进程父进程ID

4. 举个栗子

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
 
int main(){
    int count = 0;
    pid_t pid = fork();
    if(pid < 0)
        printf("error\n");
    else if(pid == 0){
        printf("Child Id = %d\n", getpid());
        count++;
    }else{
        printf("Parent Id = %d\n", getpid());
        count++;
    }
    prinf("count = %d\n", count);
    return 0;
}

输出结果为:

Parent Id = 3496
count = 1
Child Id = 3497
count = 1

父进程和子进程没有执行的先后顺序,再加个图,加深一下理解:

dd.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。