fork 系统调用
对自己知识储备的感觉就是过于肤浅,很多东西知其名后就不了了之
此系列博客将记录进程分析的学习过程,希望能够多些深度
提到进程,最容易的想到就是fork
系统调用,比较好和快速的找到的fork的相关信息就是 linux manual 了
fork(2)
fork - 创建一个新的进程
#include <unistd.h>
pid_t fork(void);
fork()
通过复制被调用进程而创建一个新的进程,新进程称为子进程,被调用的进程称为父进程。
父子进程分别在不同的地址空间运行,在调用 fork()
时两个内存空间具有相同的上下文 [1]。在内存写入时,文件映射内存mmap(2)
和文件取消映射内存munmap(2)
在一个进程内执行不会影响到其他进程。
子进程对父进程完全复制除了以下几点:
- 子进程有唯一的进程ID,并且进程ID不等于任何已经存在的进程组
getpgid(2)
或者会话 [2]。 - 子进程的父进程ID
geppid(2)
与父进程ID相同 [3]。 - 子进程不继承父进程的内存锁
mlock(2), mlockall(2)
[4]。 - 子进程资源占用
getrusage(2)
和 CPU时间计数器times(2)
被重置为0 [5]。 - 子进程的悬挂信号集(set of pending signals)初始化为空
sigpending(2)
[6]。 - 子进程不从父进程继承信号量调整
semop(2)
[7]。 - 子进程不从父进程继承相关的记录锁
fcntl(2)
,但是从父进程继承fcntl(2)
打开的文件描述符锁 [8]。 - 子进程不继承父进程的定时器
setitimer(2), alarm(2), timer_create(2)
[9]。 - 子进程不从父进程继承未完成的异步I/O操作
aio_read(3) aio_write(3)
,也不从父进程继承任何的异步I/O的上下文io_setup(2)
[10]。
以上的进程属性都在POSIX.1-2001中指定。父进程和子进程在以下特定于Linux的进程属性方面也有所不同:
- 子进程不继承父进程目录的变更通知,见
fcntl(2)
中的F_NOTIFY
[11]。 prctl(2)
的PR_SET_PDEATHSIG
为重置标志,因而子进程不能接收到父进程终止的信号 [12]。- 默认的计时器从值(slack value)设置为父进程的当前计时器从值,见
prctl(2)
的PR_SET_TIMERSLACK
标志 [13]。 - 已使用
madvise(2)
的MADV_DONTFORK
标志标记的内存映射不会通过fork()
继承 [14]。 - 子进程的终止信号总是
SIGCHLD
,见clone(2)
[15]。 - 子进程不从父进程继承由
ioperm(2)
设置的端口访问权限位,子进程必须通过使用ioperm(2)
打开任何权限位 [16]。
以下几个特点也需留意:
- 子进程是以单线程的方式创建的。父进程整个虚拟地址空间都被复制到了子进程,包括互斥锁、条件变量和其他
pthread
对象的状态;由此出现的问题时使用pthread_atfork(3)
可能会有帮助。 - 在多线程程序中使用
fork()
后,子进程可以安全的只调用异步信号安全函数(async-signal-safe,见signal-safety(7)
)直到它调用execve(2)
的时候。 - 子进程继承父进程打开文件描述符的副本。子进程中的每个文件描述符引用相同打开的文件描述符作为父进程中对应的文件描述符。两个文件描述符共享打开文件的状态标志,文件偏移量和信号驱动I/O属性(见
fcntl(2)
中的F_SETOWN F_SETSIG
标志)。 - 子进程继承父进程中打开消息队列描述符的副本(见
mq_overview(7)
)。子进程中每个文件描述符引用相同已打开的消息队列描述符作为父进程中的对应的文件描述符,意味着两个文件描述符共享相同的标志(mq_flags)。 - 子进程继承父进程打开目录流副本(见
opendir(3)
)。POSIX.1-2001表示父和子进程中对应的目录流可以共享目录流定位,Linux/glibc未实现。
[no] 表示待解决的问题
fork 系统调用的更多相关文章
- fork系统调用(转载)
(1) fork系统调用说明 fork系统调用用于从已存在进程中创建一个新进程,新进程称为子进程,而原进程称为父进程.fork调用一次,返回两次,这两个返回分别带回它们各自的返回值,其中在父进程中的返 ...
- 一个fork()系统调用的问题
转载:http://coolshell.cn/articles/7965.html 题目:请问下面的程序一共输出多少个“-”? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程
一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息 ...
- 以python代码解释fork系统调用
import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork ...
- fork系统调用方式成为负担,需要淘汰
微软研究人员发表论文称用于创建进程的 fork 系统调用方式已经很落后,并且对操作系统的研究与发展产生了极大的负面影响,需要淘汰,作者同时提出了替代方案.相信每位开发者都对操作系统中的 fork () ...
- fork()系统调用的理解
系统调用fork()用于创建一个新进程.我们可以通过下面的代码来理解,最好是能自己敲一遍运行验证. #include<stdio.h> #include<stdlib.h> ...
- 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程
GDB的那些奇淫技巧 evilpan 收录于 Security 2020-09-13 约 5433 字 预计阅读 11 分钟 709 次阅读 gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...
- glibc中fork系统调用传参
因为想跟踪下在新建进程时,如何处理新建进程的vruntime,所以跟踪了下fork. 以glic-2.17中ARM为例(unicore架构的没找到),实际上通过寄存器向系统调用传递的参数为: r7: ...
- fork系统调用关于如何让子进程先运行{wait(),waitpid(),sleep()}
在父进程里面调用wait()和waitpid()可以确保子进程先运行,因为当子进程运行完后会变成僵尸进程,此时会发送一个信号给父进程,父进程接受到信号才会运行. 有人或许会问如果在父进程调用wait之 ...
随机推荐
- Codeforces Round #267 (Div. 2) C. George and Job(DP)补题
Codeforces Round #267 (Div. 2) C. George and Job题目链接请点击~ The new ITone 6 has been released recently ...
- Dubbo近况
刚下班看到开发者头条上一篇讲dubbo前世今生的文章,总结的不错,摘录一下. 从2012年10月23日Dubbo 2.5.3发布后,在Dubbo开源将满一周年之际,阿里基本停止了对Dubbo的主要升级 ...
- obs nginx-rtmp-module搭建流媒体服务器实现直播 ding
接下来我就简单跟大家介绍一下利用nginx来搭建流媒体服务器. 我选择的是腾讯云服务器 1.下载nginx-rtmp-module: nginx-rtmp-module的官方github地址:http ...
- js中setInterval() 和 setTimeout()
setInterval() 方法 定义和用法 setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearI ...
- SpringBoot中使用spring-data-jpa 数据库操作(下)
- 解决Error for wireless request "Set Mode" (8B06) 问题 (转载)
转自:http://blog.csdn.net/muge0913/article/details/17062871 在运行以下命令的时候,意外的出错,最后google了下,最终才确定了原因,因为在运行 ...
- 0623-TP框架整理一(下载、入口文件、路由、创建控制器、调用模板、系统常量、命名空间)
一.下载解压后用ThinkPHP(核心)文件 核心文件夹(ThinkPHP)不要改,是作用于全局的,有需要可以改应用目录(Application) 二.创建入口文件: 运行后出现欢迎界面,在说明系统自 ...
- IBatis.NET 的配置
http://www.cnblogs.com/xiaogangqq123/archive/2011/06/29/2093250.html http://www.cnblogs.com/hjf1223/ ...
- [转]mysql的查询、子查询及连接查询
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/15/2502551.html 一.mysql查询的五种子句 where(条件 ...
- Asp 循环输出 form 表单提交的数据
亲测asp提交form表单数据,在接收页面循环输出数据 dim var for each var in request.form response.write var&"=" ...