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

中国做水产的有什么网站旅游包车网站最新模板

中国做水产的有什么网站,旅游包车网站最新模板,百度一下你就知道了 官网,德州市建设小学网站Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 本篇导航 0. 创建进程1. 认识fork函数2.使用Fork函数3.关于fork的为什么3.1 一个函数如何返回两次?fork究竟在干什么?3.2 为什么要给子…

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

本篇导航

  • 0. 创建进程
  • 1. 认识fork函数
  • 2.使用Fork函数
  • 3.关于fork的为什么
    • 3.1 一个函数如何返回两次?fork究竟在干什么?
    • 3.2 为什么要给子进程返回0,父进程返回子进程的PID呢?
    • 3.3 一个变量为什么会有两个不同的内容
  • 4. Bash与子进程

在这里插入图片描述

0. 创建进程

我们介绍了每一个在内存中运行的任务都称为一个进程.那么我们如何自己去创建一个进程呢?

在之前我们可以通过./xxx来运行一段程序,这样这段程序就被加载到内存当中成为了一个进程.这是在指令层面上的创建进程.

例如:

创建了一个名为proce的程序,将其运行.之后输入

ps -ajx | grep proce

image-20231103152448136

就可以查看到当前进程的相关信息.可以看到其PID为58014,PPID为57120

我们在代码中可以通过

getpid() getppid()来获取当前进程的PID和PPID,被包含在 **<unistd.h> <sys/types.h>**中,返回值为:pid_t 类型

在man二号手册中可以看到对其的相关介绍,说明其为一个系统调用接口

常见的节号包括:

  • 1:用户命令
  • 2:系统调用
  • 3:C库函数
  • 4:设备和特殊文件
  • 5:文件格式和约定
  • 6:游戏和演示
  • 7:杂项
  • 8:系统管理命令

屏幕截图 2023-11-03 213748

image-20231103213847667

那么我们在代码中如何去创建一个进程呢?

1. 认识fork函数

在代码层面中,我们可以使用fork去创建我们的子进程.

我们先来简单看下这个函数的接口说明,在man二号手册中可以看到对其的相关介绍.说明fork是一个系统调用接口

常见的节号包括:

  • 1:用户命令
  • 2:系统调用
  • 3:C库函数
  • 4:设备和特殊文件
  • 5:文件格式和约定
  • 6:游戏和演示
  • 7:杂项
  • 8:系统管理命令
man fork

屏幕截图 2023-11-03 210854

image-20231103210919090

函数接口:

pid_t fork(void)

头文件:

#include <sys/types.h>
#include <unistd.h>

返回值:

若成功创建子进程则对父进程返回子进程ID,对子进程返回0

我们来试着使用一下fork函数

2.使用Fork函数

先直接写一个简单的代码

#include <stdio.h>
#include <unistd.h>
int main()
{printf("before:\n");pid_t id=fork();printf("after:\n");sleep(1);return 0;
}

编译运行,惊奇的发现:before被打印了一次,after被打印了两次.

image-20231103212759610

我们可以得出一个结论:代码段在fork之后的部分被执行了两次

我们再来看看这份代码:

#include <stdio.h>
#include <unistd.h>
int main()
{printf("pid: %d\n",getpid());pid_t id=fork();if(id>0){while(1){printf("my pid : %d , my parent :%d,id:%d\n, ",getpid(),getppid(),id);sleep(1);}}else if(id==0){while(1){printf("my pid : %d , my parent :%d,id:%d\n",getpid(),getppid(),id);sleep(1);}}return 0;
}

image-20231103221733998

  • 居然在一份代码中既执行了if,又执行了else.这意味着id既 >0 又 <=0

​ 这在我们过去的学习中是不可能出现的事情.

  • 根据之前所学,fork()对父进程返回子进程PID,对子进程返回0

    所以 249101是父进程,249102是子进程

现在肯定有以下疑问:

  1. 一个函数如何返回两次?
  2. 为什么要给子进程返回0,父进程返回子进程的PID呢?
  3. 一个变量为什么会有两个不同的内容
  4. fork究竟在干什么?

3.关于fork的为什么

在将之前,我们先来理解下这个概念:子进程 创建时会和父进程共享内存中的代码与数据

80d9fb610e3f18a4441e5584b71bb21

这里只是将他们分开来看了,实际中是使用同一个地址上的内容

3.1 一个函数如何返回两次?fork究竟在干什么?

我们这两个问题一起来看.

假设这是一份fork函数的伪代码

pid_t fork()
{创建子进程task_struct 填充PCB对应内容让父子进程指向相同的代码可以被CPU调度运行了子进程创建完成   return ret;
}

注意看最后的一步return ret,此时子进程已经被创建出来了.他共享到了return ret.所以父子进程都需要返回一个ret的值;

我们可以大胆假设:

  • **ret为一个被初始化为0的变量.在填充子进程对应PCB这一步中,ret被赋值为子进程对应的PID.**但此时ret还未被子进程共享.

    子进程共享时,仅共享到了未被赋值的ret,所以返回时因为都有return 所以返回两次

3.2 为什么要给子进程返回0,父进程返回子进程的PID呢?

这是为了方便我们对进程进行管理.

如同上面的代码,我们通常情况下,希望父进程和子进程做不同的事情.所以需要对其进行分流

3.3 一个变量为什么会有两个不同的内容

这里可以先简单的理解为发生了 写时拷贝

虽然父子进程共享代码中的数据,但当任何一个进程需要修改变量中的内容时,会拷贝一份新的数据供修改对象使用.

这里后面谈进程地址空间时会详细解释.

4. Bash与子进程

我们运行起刚刚的进程后,用ps查看发现父进程的PPID(父进程的父进程)为80738.这是什么呢?

image-20231103224811352

发现其为zsh(一个Bash)

image-20231103225006415

的数据供修改对象使用.

这里后面谈进程地址空间时会详细解释.

平常我们在命令行中输入一个指令,bash负责解释完这个指令会新起一个子进程去运行本条指令.
image-20230905164632777

http://www.yayakq.cn/news/741104/

相关文章:

  • 国内建站平台有哪些网站 mip
  • 建设用地规划许可证在哪个网站查询有哪些好的模板网站
  • 热门专业单页网站seo优化
  • 钢材销售网站建设用KEGG网站做KEGG富集分析
  • 手机建立网站山东专业网站建设
  • 广州自助网站搭建制作公司网站建设的经费预算
  • 大连开发区网站开发公司php做手机网站
  • visual studio做的网站中级平面设计师证书有用吗
  • 石头科技 网站开发做文学网站用什么域名
  • 给企业做网站的公司西安番禺做网站服务
  • 表白网页制作网站福州网站建设加推广
  • 网站建设七点网站哪些页面会做静态化
  • 广州网站建设企业东莞公司注册官网
  • 怎么用ps做网站首页背景图片西安市住宅和城乡建设局网站
  • 自己做企业网站服务器wordpress 喜欢
  • 曰本做爰视频网站wordpress 搭建平台
  • 淄博乐达网站建设吧经典logo设计案例分析
  • 重庆网站排名优化wordpress屏蔽自带密码重置
  • so域名网站白银市住房与建设局网站
  • 网站建设北京市新型建筑模板设备
  • 嘉兴网站制作计划自己做网站外包
  • 宝安网站设计项目浙江省建设信息港网
  • 怎么看待网站开发拼多多seo是什么意思
  • 昆明市城乡建设局网站网站版心怎么做
  • 静安区网站建设wordpress仿国际
  • 买模板做的网站表单数据在哪里看可视化网站制作软件
  • 顾问式 网站能不能不用虚拟主机建设网站
  • 网站分站开发计划书北京百度推广投诉电话
  • 安康市有没有滴滴平台网络营销的优化和推广方式
  • 园区做网站长春百度关键词搜索