对自己知识储备的感觉就是过于肤浅,很多东西知其名后就不了了之

此系列博客将记录进程分析的学习过程,希望能够多些深度

提到进程,最容易的想到就是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]。
  • 子进程的父进程IDgeppid(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 系统调用的更多相关文章

  1. fork系统调用(转载)

    (1) fork系统调用说明 fork系统调用用于从已存在进程中创建一个新进程,新进程称为子进程,而原进程称为父进程.fork调用一次,返回两次,这两个返回分别带回它们各自的返回值,其中在父进程中的返 ...

  2. 一个fork()系统调用的问题

    转载:http://coolshell.cn/articles/7965.html 题目:请问下面的程序一共输出多少个“-”? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  3. 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程

    一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息 ...

  4. 以python代码解释fork系统调用

    import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork ...

  5. fork系统调用方式成为负担,需要淘汰

    微软研究人员发表论文称用于创建进程的 fork 系统调用方式已经很落后,并且对操作系统的研究与发展产生了极大的负面影响,需要淘汰,作者同时提出了替代方案.相信每位开发者都对操作系统中的 fork () ...

  6. fork()系统调用的理解

    系统调用fork()用于创建一个新进程.我们可以通过下面的代码来理解,最好是能自己敲一遍运行验证. ​#include<stdio.h> #include<stdlib.h> ...

  7. 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程

    GDB的那些奇淫技巧 evilpan 收录于 Security  2020-09-13  约 5433 字   预计阅读 11 分钟  709 次阅读  gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...

  8. glibc中fork系统调用传参

    因为想跟踪下在新建进程时,如何处理新建进程的vruntime,所以跟踪了下fork. 以glic-2.17中ARM为例(unicore架构的没找到),实际上通过寄存器向系统调用传递的参数为: r7: ...

  9. fork系统调用关于如何让子进程先运行{wait(),waitpid(),sleep()}

    在父进程里面调用wait()和waitpid()可以确保子进程先运行,因为当子进程运行完后会变成僵尸进程,此时会发送一个信号给父进程,父进程接受到信号才会运行. 有人或许会问如果在父进程调用wait之 ...

随机推荐

  1. 8-2 canvas专题-线条样式

    8-2 canvas专题-线条样式 学习要点 对第五章知识进行简单的回顾和总结 进一步讲解canvas绘图相关的知识点 第八章内容介绍 在第八章中我们将对以前的知识进行简单的回顾,着重对canvas绘 ...

  2. MAMP/xampp安装redis

    nmp/amp/xampp安装redis 一.安装redis服务 1.通过homebrew安装redis sudo brew install redis 2.启动redis服务,且接受客户端连接 su ...

  3. bzoj 1709: [Usaco2007 Oct]Super Paintball超级弹珠【枚举】

    k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则a ...

  4. 10.19NOIP模拟赛(DAY2)

    /* 正解O(n)尺取法orz 我写的二分答案.本来以为会被卡成暴力分...... 这个-'0'-48是我写的吗........我怎么不记得... */ #include<bits\stdc++ ...

  5. P3626 [APIO2009]会议中心

    传送门 好迷的思路-- 首先,如果只有第一问就是个贪心,排个序就行了 对于第二问,我们考虑这样的一种构造方式,每一次都判断加入一个区间是否会使答案变差,如果不会的话就将他加入别问我正确性我不会证 我们 ...

  6. 洛谷 P1462 通往奥格瑞玛的道路(spfa+二分搜索)(4boy)

    原题:http://www.luogu.org/problem/show?pid=1462#sub 4boy: 大意:给出n个城市,有m条路,每经过一个城市都要交钱,每经过一条道路都要扣HP,有HP上 ...

  7. 基于ASP.Net Core开发一套通用后台框架记录-(总述)

    写在前面 本系列博客是本人在学习的过程中搭建学习的记录,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 前期我不会公开源码,我想是一点点敲代码,不然复制.粘贴那就没意思了. ...

  8. Java多线程(九) synchronized 锁对象的改变

    public class MyService { private String lock = "123"; public void testMethod() { synchroni ...

  9. JMeter配置MongoDB

    1.启动JMeter,右键添加->配置文件->MongoDB Source Config. 注意:JMeter 3.0以上版本去掉了此配置项,可以从低版本处拷贝. 2.设置MongoDB配 ...

  10. 400 Nth Digit 第N个数字

    在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字.注意:n 是正数且在32为整形范围内 ( n < 231).示例 1:输入:3 ...