当前位置: 首页 > news >正文

聊城做网站的公司市场菏泽资深seo报价

聊城做网站的公司市场,菏泽资深seo报价,专做苹果二手手机的网站,海外网站导航文章目录 前言fork 基本概念代码演示示例1:体会 fork 函数返回值的作用示例2:创建多进程,加深对 fork 函数的理解 前言 本篇介绍 fork 函数。 fork 基本概念 pid_t fork(void) fork 的英文含义是"分叉",在这里就是 …

文章目录

  • 前言
  • fork 基本概念
  • 代码演示
    • 示例1:体会 fork 函数返回值的作用
    • 示例2:创建多进程,加深对 fork 函数的理解

前言

本篇介绍 fork 函数。

fork 基本概念

pid_t fork(void)

fork 的英文含义是"分叉",在这里就是 创建子进程。返回值:失败:-1成功,两个返回值:如果当前进程是 父进程,则返回子进程的 id如果当前进程是 子进程,返回 0,返回 0 也表示创建子进程成功可以通过 fork 的返回值判断当前进程是 父进程 还是 子进程。

是的,你没有看错,fork 有两个返回值,这属实有点逆天。

那么 fork 的两个返回值有什么用呢 ?

不着急回答,我们先图解一下 fork:
在这里插入图片描述

左侧是 a 文件中的代码,在 fork 函数前有一堆代码,在 fork 函数后有两行。
在执行 fork() 后,创建了一个子进程(右图),子进程拥有和父进程一样的代码。【其实是不完全一样的,本篇是"浅谈",所以不搞复杂了】

重点来了:

  1. 子进程拥有和父进程一样的代码。
  2. 子进程会和父进程一起执行后续的代码。

如果只想让父进程执行 代码1,子进程执行 代码2,该怎么做呢?
这里 fork 的返回值就派上用场了,fork 的返回值就是用来区分父、子进程,为父、子进程指定不同的业务,具体实现会在"代码演示"中介绍。

代码演示

关于 fork 的概念没什么可说的,直接结合代码,更深入的理解 fork 吧。

示例1:体会 fork 函数返回值的作用

#include <stdio.h>
#include <unistd.h>int main() {int pid ;printf("AAA\n\n");pid = fork();if(pid > 0) {printf("开始执行父进程的代码\n");printf("I'm parent, my id %d .\n", getpid());printf("父进程的代码执行完毕.\n\n");} else if(pid == 0) {printf("开始执行子进程的代码\n");printf("I'm child. my id: %d\n", getpid());printf("子进程的代码执行完毕.\n\n");}printf("BBB.\n");
}

在这里插入图片描述

【非常重要】我们分析以上的输出结果:
① 两个分支都执行了,这证明 fork 返回了两个值,父、子进程会各自进入条件逻辑中执行自己的代码
② “BBB” 被输出了两次,这说明 父、子进程都会执行 fork 函数后面的代码,只有在遇到条件逻辑时,父子进程 才会执行各自的代码。
③ 通过 fork 的返回值,可以区分 父、子进程,从而为 父、子进程 分配不同的业务逻辑。
④ fork 之后 父进程 和 子进程 的执行顺序不确定,这取决于内核所使用的调度算法。【这点没体现出来,但是得知道】

到此,fork 的返回值就解释完了。

我们最后再通过创建多进程来加深对 fork 函数的理解。

示例2:创建多进程,加深对 fork 函数的理解

我们知道,创建进程使用的是 fork 函数,那么创建多进程自然就是循环调用 fork 函数了。

最容易想到的是下面这样:

    for(i=0; i<5; i++) {// 创建 5 个进程pid = fork();if(pid > 0){printf("我是第 %d 个 子进程.\n", i);}}

你仔细想想,这对吗?
我们运行一下:
在这里插入图片描述

原因就是上面提到过的第 ② 句: " 父、子进程都会执行 fork 函数后面的代码,只有在遇到条件逻辑时,父子进程 才会执行各自的代码 "。

也就是说父进程在创建出子进程后,子进程也会继续执行 for 里面的语句,这就会导致子进程继续创建 子子进程,子子进程 也会继续执行 for 里面的语句,然后以此类推,子子进程,再创建 子子子进程 …

要解决这个问题,就是创建出子进程后,让子进程执行完逻辑后就马上退出 for 循环,不要继续创建 子子进程。

正确逻辑如下:

#include <stdio.h>
#include <unistd.h>int main() {int pid, i;for(i=0; i<5; i++) {// 创建 5 个进程pid = fork();if(pid == 0){printf("我是第 %d 个 子进程, pid: %d\n", i, getpid());break;  // 直接让子进程跳出循环}sleep(1);  // 让进程的输出变得有序}return 0;
}

在这里插入图片描述

题外话:
因为当前示例只是为了演示多进程的创建,加深对 fork 函数的理解,所以采用了 break 的方式假装结束子进程的运行,实际上子进程只是跳出 for 循环,子进程还是会继续运行 for 之外后续的语句,但是 for 之外没有后续语句了,子进程就执行完毕,所以这看起来是 break 后子进程就结束了。

实际上结束进程应采用特定的函数,由于本篇只是 “浅谈”,让读者专注于最核心的部分,所以就不扯多了。

http://www.hrbkazy.com/news/3108.html

相关文章:

  • 苏州网站优化企业百度关键词规划师入口
  • 模板网站建设的弊端百度网盘登陆入口
  • 网站百度排名查询个人接外包的网站
  • wordpress 403 - 禁止访问: 访问被拒绝长沙seo网站优化
  • 大武口做网站的竞价外包代运营公司
  • 网站建设宣传册数字营销策略有哪些
  • 企业名称的英文做网站名百度seo优化及推广
  • 聋哑工作设计做网站站长统计app软件下载官网安卓
  • 国际品牌的广州网站建设模板之家
  • 深圳效果好的免费网站建设海外网站推广优化专员
  • 对于给不良网站发律师函如何做怎么做网站关键词优化
  • 做搜狗网站优化点百度快速收录方法
  • jsp网站开发详解pdf哪个搜索引擎能搜敏感内容
  • 做网站怎插入背景市场推广是做什么的
  • 响应式外贸网站价格百度怎么搜索图片
  • 做网站企业的发展前景武汉seo优化排名公司
  • 济南网站建设方案案例展示手机端竞价恶意点击
  • 外贸网站建设ppt模板下载广州关键词快速排名
  • 网站设计外包协议大数据营销推广精准粉
  • 烟台网站开发西安楼市最新房价
  • 长沙网站设计联系地址百度竞价推广账户优化
  • 网站两侧固定广告代码国内做网站比较好的公司
  • 网站利用e4a做app百度平台营销
  • 泾阳网站建设百度推广登录首页官网
  • 泰安网络公司推荐天津关键词优化专家
  • 不用编程做网站seo软件系统
  • 做网站推广有哪些公司怎样推广app
  • 网站没有域名朝阳seo推广
  • 做网站的步骤seo入门视频
  • admin后台管理系统网络优化工程师招聘信息