惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Forbes - Security
Forbes - Security
IT之家
IT之家
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
雷峰网
雷峰网
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
V
Visual Studio Blog
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Schneier on Security
Schneier on Security
P
Privacy International News Feed
G
Google Developers Blog
博客园 - 聂微东
博客园 - 叶小钗
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Simon Willison's Weblog
Simon Willison's Weblog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
H
Hacker News: Front Page
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
T
The Exploit Database - CXSecurity.com
S
Security @ Cisco Blogs
博客园_首页
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
T
Threatpost

WangDeer

非机动车交通规则测验 微软 50 周年壁纸是在 macOS上设计的? 「转」西二旗折叠:蜂巢经济学启示录 难得空明 Ubuntu Clean ApidocJs apigroup Support Chinese int(10)里面的10是什么意思? 5-3 会话 2021-03-25 「PHP架构师」面试准备 Laravel 上传 Docx 文件,表单验证不通过 4-4 发送信号 4-3 信号集 4-2 编写中断信号处理程序 2022-03-10 面试复盘 4-1 什么是中断信号(软中断) 3-7 进程查看 3-6 SUID特权进程 3-5多进程编写 3-4进程调度 3-3进程exec 3-2进程退出和回收 2-3解释器文件 2-2命令行参数与环境参数表 2-1程序与进程 1-1课程介绍 终极复盘 第八章 传承篇 第七章 自由篇 第六章 品牌篇 第五章 作品篇 第四章 定位篇 第三章 金钱篇 第二章 富人篇 第一章 财务自由篇 财富思维觉醒课前作业 This Set Cookie Was Blocked Because It Was Not Sent Over a Secure Connection 「转」Windows11右键恢复至Windows10模式 Ecshop 4.0 微信登录 一直循环授权登录 PHP判断指定日期是否为工作日 PHP Ajax 跨域请求允许多个域名 返回键劫持,强制跳转到指定链接 Chromium Adobe Flash Player下载 批量检查并清除BOM头 Ecshop之smarty与js冲突问题 Ecshop 广告位宽度值必须在1 1024之间 修改方法 PHP获取指定时区当前时间-PHP获取世界时钟 phpcms 更新栏目缓存 `PHP Has Encountered a Stack Overflow` 解决办法 php判断是否手机访问-php判断访问终端类型 丢了 如果昨天是明天的话就好了,这样今天就周五了 Ecshop自定义调用指定广告位 Destoon修改商务便签文字 Ecshop首页获取指定分类的推荐商品 QQ空间如何屏蔽好友刷屏广告 Css实现文字竖排 英尺(inch)、厘米(cm) JS转换 网页禁止鼠标右键 Destoon 选择支付方式 可单独关闭对联广告两枚 网页打开不是在最顶部,而是跳到中间位置解决方法 Ecmall iis 伪静态规则 Destoon 复制商城模块 QQ在线客服设置 QQ开启临时会话教程 Ecshop加入购物车js报错 IE浏览器“浏览器模式”和“文本模式” 网站图片在IE浏览器下不显示 Ecshop 去掉头部版权信息 echsop “transport.js/run() error:'process_request' 未定义”-解决方法 Ecshop Deprecated:Assigning the Return Value of New by Reference Is Deprecated in 报错解决方法 PHPCMS全局循环调用二级类目导航 如何使EditPlus打开tpl文件高亮显示代码 Ecshop前台英文后台中文实现方法 Ecshop安装报错warning:date_default_timezone_get() 1970年1月1日(00:00:00 GMT)Unix时间戳(Unix Timestamp) 黑莓bb微信 2.6 for os5 黑莓微信内测版问题总结及开发建议 360安全卫士卸载过程 管理距离AD值(Administrative Distance) 思科在中国的总代及金牌、银牌代理商 黑莓7100T拆机全程实录 CCNA静态路由配置实例 8700G国产壳白色,太粗糙了 黑莓7100T玉照曝光 黑莓手机电池的正确使用和保养 51啦统计不能打开,求分析,求解释 处女作,黑莓8707G4.2主题出炉 我的2011 Xweibo手机版底部版权修改 常用ping地址,逗逗搜索引擎,SEO必备 飞飞影视系统快播播放列表前缀修改 飞飞影视系统title修改 这才整明白啥叫被跨省,上网有风险,发帖需谨慎 为emlog添加Gravatar头像服务功能 三层交换机实现VLAN间通信 路由器的基本配置 路由器接口类型及连接方式 19岁双IE 谈Cisco认证 Secondary IP-Address 用途 儿童节NA战报 CCNA疑难解析之network x.x.x.x
3-1进程标识与fork
王二 · 2022-02-28 · via WangDeer

进程标识

一个程序被加载到内存中运行,系统会为这个进程分配相应的标识信息,比如 pid,ppid,uid,euid,pgid,sid,gid,egid…

进程查看命令

  • pstree 可看出进程间的关系 父子,兄弟;
  • ps -exj
  • ps -aux
  • ps

PID PPID PGID UID TTY STAT TIME COMMAND

laradock@3a6c2da5a07b:/var/www$ ps exj
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0      24      24      24 pts/1        495 Ss    1000   0:00 bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/larado
     24     495     495      24 pts/1        495 R+    1000  13:37 php demo4.php LC_ALL=en_US.UTF-8 NVM_DIR=/home/laradock/.nvm LS_COLORS=no=00:fi=00:
      0     496     496     496 pts/2       1051 Ss    1000   0:00 bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/larado
    496    1051    1051     496 pts/2       1051 R+    1000   0:00 ps exj LC_ALL=en_US.UTF-8 NVM_DIR=/home/laradock/.nvm LS_COLORS=no=00:fi=00:di=01;3

进程状态码

  • D uninterruptible sleep (usually IO)
  • I Idle kernel thread
  • R running or runnable (on run queue)
  • S interruptible sleep (waiting for an event to complete)
  • T stopped by job control signal
  • t stopped by debugger during the tracing
  • W paging (not valid since the 2.6.xx kernel)
  • X dead (should never be seen)
  • Z defunct (“zombie”) process, terminated but not reaped by its parent

打印进程标识

fprintf(STDOUT, "pid=%d\n", posix_getpid());                  // 进程自己的标识   PID
fprintf(STDOUT, "ppid=%d\n", posix_getppid());                // 父进程的标识     PPID
fprintf(STDOUT, "pgid=%d\n", posix_getpgrp());                // 进程组长标识     PGID
fprintf(STDOUT, "sid=%d\n", posix_getsid(posix_getpid()));    // 会话标识         SID
fprintf(STDOUT, "uid=%d\n", posix_getuid());                  // 用户标识         UID    当前登录用户,实际用户id
fprintf(STDOUT, "gid=%d\n", posix_getgid());                  // 组ID            GID
fprintf(STDOUT, "euid=%d\n", posix_geteuid());                // 有效用户id       EUID
fprintf(STDOUT, "egid=%d\n", posix_getegid());                // 有效组id         EUID
pid=506
ppid=37
pgid=506
sid=37
uid=1000
gid=1000
euid=1000
egid=1000

pcntl_fork

fork

执行过程:

demo4.php

<?php

$pid = pcntl_fork(); // 父进程从这里开始运行

fprintf(STDOUT, "pid=%d run here \n", posix_getpid()); // 子进程从这里开始运行;
  • shell 终端输入 php demo4.php
  • 父进程执行 pcntl_fork 函数;
  • 函数执行成功之后,创建一个子进程,「子进程会复制父进程的代码段和数据段」;
  • 父进程继续执行 fprintf(STDOUT, "pid=%d run here \n", posix_getpid()); 父进程结束;
  • 子进程开始执行 fprintf(STDOUT, "pid=%d run here \n", posix_getpid());,子进程结束。

执行顺序

// fork

fprintf(STDOUT, "我现在的标识是:%d \n", posix_getpid());

$pid = pcntl_fork(); // 父进程从这里开始运行

fprintf(STDOUT, "\$pid=%d \n", $pid); // 子进程从这里开始运行;

if (0 == $pid) {
    // 子进程
    fprintf(STDOUT, "我是子进程我先来,pid=%d, ppid=%d, \$pid=%d run here \n", posix_getpid(), posix_getppid(), $pid);
} else {
    // 父进程
    sleep(2); // 父进程睡眠让子进程先运行

    fprintf(STDOUT, "我是父进程我断后,pid=%d, ppid=%d, \$pid=%d run here \n", posix_getpid(), posix_getppid(), $pid);
}
我现在的标识是:2463 
$pid=2464 
$pid=0 
我是子进程我先来,pid=2464, ppid=2463, $pid=0 run here 
我是父进程我断后,pid=2463, ppid=1381, $pid=2464 run here 

当父进程调用 pcntl_fork 函数之后,创建出子进程,这个时候就有2个进程;

哪个进程先运行是无法确定的,进程调度由系统决定;

通常都是父进程先运行,子进程后运行,如果说父进程先运行,先结束,这个时候子进程就没有父亲,成为了孤儿进程,会被1号进程接管;

变成孤儿进程的后果就是:子进程跑到后台运行,不在前台运行;

所以我们一般让父进程后结束,先让子进程先运行;

当子进程被创建后,它会复制父进程的相关数据「是写时复制 COW copy on write」,父、子进是使用同一块内存空间;

当子进程要修改内存空间时,这个时候,系统会复制新的内存空间给子进程修改;

子进程得到的数据: $pid,它得到的结果是0;

子进程先结束,父进程后结束,这种情况一般来说是正常的,父进程应该回收子进程;

子进程结束时还会生成一些数据,比如说状态码等其它信息,并没有完全释放,需要父进程回收。