【Linux】fork

fork函数调用特点

  一次调用,两个返回

    为什么?

      每个进程在各自的地址空间中返回---->站在Linux内核角度思考fork调用

fork是一个系统调用,在Linux内核中完成

fork返回值为什么设计成pid>0是父进程, =0是子进程?

  一个父进程可以有N个子进程,父亲找儿子的pid比较难

fork理解角度:一次调用 两个分支同时运行 (并发)

fork子进程为什么从fork之后运行,不是从main函数从头开始?

  这和fork创建子进程的机制有关,子进程创建的机制为写时复制

  子进程要拷贝父进程的代码段、堆栈段、数据段、PCB进程控制块

  PCB控制块是Linux内核管理进程的数据结构(task_struct)

  

  因为子进程拷贝了父进程的运行场景,所以子进程没有必要再从main函数开始再运行一遍了

写时复制理解:

  子进程修改变量的时候才拷贝

  只拷贝页  ----->Linux内核的内存管理

系统错误码在全局变量errno里面

在程序中,perror可以把errno对应string打印

时间: 2024-11-08 23:16:38

【Linux】fork的相关文章

【Linux】鸟哥的Linux私房菜基础学习篇整理(十一)

1. 直接将命令丢到后台中执行“&”,在命令最后加“&”.    将目前的工作丢到后台中暂停:[Ctrl]+z 2. jobs [-lrs]:查看目前的后台工作状态.参数:-l:除了列出job number与命令串外,同时列出PID号码:-r:列出正在后台run的工作:-s:列出正在后台stop的工作. 3. fg %jobnumber:把后台的工作拿到前台执行.参数:无参数:默认去除含+的工作:%jobnumber:jobnumber是工作号码,%可省略. 4. bg %jobnumbe

【Linux】C++后台开发面试

本文将讲述(Linux)服务器后台开发岗位的要求,包含了大部分会遇到的面试题目.掌握文中提到的技术,也算少许入门水平了,此文既是面经,也是后台开发的入门手册.无论社招还是校招,都可作为一个参考. 本文内容收集自知乎和其他博客,在此整理成章. 校招:以C++基础为主,数据结构和常见算法(ACM经典题目)是必须掌握的. 技术类面试跟学校的经验 / 社团经验 / 学习成绩 挂钩不太高,当然不是说两者没关系.成绩好面试官可喜欢了,但成绩一般的同学不用灰心,入选初面的条件是简历上突出你的技术水平,不需要写

【Linux】Jenkins以war包运行及开机启动配置(四)

本例介绍jenkins已war包运行及开机启动配置 环境:Linux环境(CentOS 7.4) 以war包运行 1.下载jenkins.war包 2.启动war包( 默认端口:8080,默认JENKINS_HOME目录:-/.jenkins ) 前台启动命令:java -jar jenkins.war 后台启动命令:nohup java -jar jenkins.war & 3.使用浏览器打开地址:http://ip:8080,即可访问到jenkins 关闭jenkins,页面访问地址:htt

【Linux】数据流重导向(前篇)

数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其他地方去』的样子? 没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)!这玩意儿在 Linux 的文本模式底下可重要的! 尤其是如果我们想要将某些数据储存下来时,就更有用了! 1)什么是数据流重导向? 什么是数据流重导向啊?这得要由命令的运行结果谈起!一般来说,如果你要运行一个命令,通常他会是这样的: 我们运行一个命令的时候,这个命令可

【APUE】fork函数

#include <unisth.h> pid_t fork(void) fork函数被调用一次,返回两次.子进程的返回值是0,父进程的返回值是子进程的进程id. 子进程和父进程继续执行fork调用之后的指令,子进程是父进程的副本,子进程获得父进程数据空间.堆和栈的副本.注意:这是子进程所拥有的副本,父子进程并不共享这些存储空间部分.父子进程共享正文段 #include <stdio.h> #include <sys/types.h> #include <unis

【Linux】鸟哥的Linux私房菜基础学习篇整理(一)

最近,一直在写PPC的模拟器和汇编器,也在做设计.所以重新看了看<鸟哥的Linux私房菜>,还是有好多命令不太熟悉.就打算写几篇blog记下来. 1. nl [-bnw] filename:添加行号打印参数:-b:指定行号指定的方式,主要有两种: -b a:表示不论是否为空行,也同样列出行号(类似cat -n): -b t:如果有空行,空的那一行不要列出行号(默认值).-n:列出行号表示的方法,主要有三种: -n ln:行号在屏幕的最左方显示: -n rn:行号在自己字段的最右方显示,且不加0

【Linux】JDK+Eclipse 搭建C/C++开发环境

注:本文所提供的参考示例是在CentOS Linux环境下的安装,不保证适用于其他版本的Linux系统. ·    安装前的注意事项 编译源代码是需要对应的代码编译工具的,本文中安装的Eclipse只是一个编写代码的外壳,不能对代码进行编译工作,所以你的Linux系统应当安装了编译器,这样Eclipse在编译源代码的时候才可以调用到对应的编译器:小编安装了的GCC,也就是我的Eclipse使用g++/gcc 进行代码的编译工作.如果你还没安装GCC的话请参见: [Linux]Linux下GCC的

【Linux】将Oracle安装目录从根目录下迁移到逻辑卷

[Linux]将Oracle安装目录从根目录下迁移到逻辑卷 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Linux逻辑卷的创建和管理(重点) 1.2.2  相关文章链接 linux逻辑卷管理:http://blog.itpub.net/26736162/viewspace-2124620/,这篇文章非常不错. 1.2.3  本文简介 由于Oracle

【linux】启动

原创,转载时请注明,谢谢.邮箱:[email protected],?地址:http://www.cnblogs.com/embedded-tzp ? 墨迹这么久,总算开始内核源代码分析了. 阶段1 阶段1大部分为汇编, 以程序启动到执行到start_kernel函数为第一阶段. 变量与文件的对应关系. THUMB: src\arch\arm\include\asm\unified.h head.S的很多定义在src\arch\arm\kernel\head-common.S struct pr