ECF_Signals_and_Nonlocal_Jumps_罗世通

Similar documents
ebook15-10

IntelBook_cn.doc


ebook

linux进程间通信

第6章 信号量,中断和时间

多进程管理副本.key

C/C++ - 字符输入输出和字符确认

378高雄市都市計畫說明書

chap07.key

关于规范区委、区委办公室发文

Microsoft Word - ??山

Microsoft Word - 助理人員教育訓練-會計室.docx

Microsoft PowerPoint - os_4.ppt

Microsoft Word - 三峽鎮衛生所_3_-張家宸.李永繁.doc

Microsoft Word - 武漢大學交流營心得_黃莉云_.doc

Microsoft Word - 生活禮儀柯友惠981

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

目 录 第 一 章 电 力 行 业 内 部 控 制 操 作 指 南 概 述... 1 第 二 章 内 部 控 制 规 范 体 系 建 设 与 运 行 第 三 章 内 部 环 境 建 设 第 一 节 组 织 架 构 第 二 节 发 展 战 略 第 三 节

CC213

Intruduction to the NGINX stream subsystem and OpenResty's support

第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持

編輯要旨 一 教育部為了協助本國失學民眾 新住民及 其他國外朋友 有系統的學習華語文的 聽 說 讀 寫 算等識字能力及跨文化 適應 以培養具有基本公民素養的終身學 習者 特別委託新北市政府教育局新住民 文教輔導科團隊編輯本教材 二 依據上述目的 本教材共有六冊 並分為 六級 分級及單元名稱詳如下表

Microsoft Word 箕æ−¥ï¼‹å®ı稿;

98年度即測即評學科測試與即測即評即發證技術士技能檢定簡章

PowerPoint Presentation

46 * the current mask in old_mask and block until a signal comes in. 47 */ /* 自动地更换成新的信号屏蔽码, 并等待信号的到来 * * 我们需要对系统调用 (syscall) 做一些处理 我们会从系统调用库接口取得某些信息

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

不不可能完成的任务从 用户空间窃取内核数据 Yueqiang Cheng, Zhaofeng Chen, Yulong Zhang, Yu Ding, Tao Wei Baidu Security

内 容 培 训 目 标 基 础 知 识 常 用 监 控 命 令 在 实 战 中 综 合 运 用 2

响应式在iOS开发中的应用 For PDF

C/C++ - 函数

普 通 高 等 教 育 十 二 五 重 点 规 划 教 材 计 算 机 系 列 中 国 科 学 院 教 材 建 设 专 家 委 员 会 十 二 五 规 划 教 材 操 作 系 统 戴 仕 明 姚 昌 顺 主 编 姜 华 张 希 伟 副 主 编 郑 尚 志 梁 宝 华 参 编 参 编 周 进 钱 进

华恒家庭网关方案

Qcon北京2018-《唯快不破——高效定位线上 Node.js 应用内存泄漏》-黄一君

有 不 同 想 法 馬 上 記 錄 下 來, 作 為 寫 作 和 較 特 殊 題 型 的 答 題 材 料 把 握 這 四 到, 再 加 上 考 試 用 書 的 重 點 整 理, 搭 配 服 用, 讓 課 文 與 你 不 再 有 距 離 2. 考 試 成 績 好 差, 心 情 也 好 差, 可 不 可

Tangram For GMTC 2017.key

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

Python 和 人 工智能基 础课程 ( 第 二课 ) 张威, 雷雷萧萧

Kernel Kernel Kernel Kernel load estimator runqueue kernel/sched.

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

ebook15-C

Go构建日请求千亿微服务最佳实践的副本

甄選入學howhow作印刷校過版

<4D F736F F D204C696E7578CFB5CDB3B5F7D3C3C1D0B1ED>

(Microsoft Word - \260\352\244\244\263\314\262\327\252\251_1_.doc)

JLX

\\Lhh\07-02\黑白\内页黑白1-16.p

四 本 學 期 程 架 構 : (1) 學 活 流 程 與 策 略 視 聽 故 事 時 事 節 令 生 活 問 題 預 習 單 朗 讀 問 答 討 論 討 論 理 解 欣 賞 想 像 練 習 章 結 構 敘 寫 技 巧 修 辭 要 領 仿 作 造 字 原 理 字 義 釐 清 字 音 字 形 辨 析

Microsoft Word - å�¦ä¹€å¿…å¾Šå’‹éłƒï¼‹å®ı稿;(.doc

Andes Technology PPT Temp

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

星河33期.FIT)

《路得記》4章 1-23節

Microsoft Word doc

技 术 文 件

新版 明解C言語入門編

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

站在巨人的肩膀上 - 使用Symfony框架开发你的下一个项目.key

Microsoft Word - MSP430 Launchpad 指导书.docx

新美大酒店开放平台SDK(.NET版)使用说明.pages

3. 圖 解 策 略 (1) 利 用 流 程 圖 心 智 圖 分 類 表 等 圖 表 整 理 重 點, 並 分 析 重 點 的 關 係 (2) 分 析 文 意 脈 絡 結 構 圖, 了 解 脈 絡 的 關 聯 性 三 閱 讀 策 略 的 使 用 建 議 : 1. 教 學 使 用 建 議 ( 詳 見

Microsoft PowerPoint - wu_si_chong_2nd_hua_zu_hun_su

python_free

ARM中C和汇编混合编程及示例.doc

提纲 1 2 OS Examples for 3

张炅轩-360基础架构之一:插件化漫谈-3.正式演讲.key

Chapter 9: Objects and Classes

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9


TX-NR3030_BAS_Cs_ indd

when-memory-safe-langueages-become-unsafe-defcon-china-cn

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

附件二:

Bilibili海量监测平台的演进之路


詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

Chap07

5 功 能 选 择 键 10 电 源 指 示 灯 基 本 操 作 时 钟 设 置 时 钟 显 示 屏 闪 烁 说 明 没 有 显 示 正 确 的 时 间 通 过 以 下 步 骤 调 整 时 间 : 按 参 数 选 择 键 选 择 时 钟 图 标 ( 如 果 你 是 第 一 次 接 电 源 或 断 电

各位法師各位居士大德阿彌陀佛


C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

M E M O 內 部 通 讯

M E M O 內 部 通 讯

AS北京2017-《知乎 Feed 流构架演进》-姚钢强.key

习题课

学习MSP430单片机推荐参考书

Hippy-VueConf

1

Microsoft Word - 出國報告_BEMAC_.doc.docx

ac2017-joeyguo-2.0.key


Microsoft Word - InoTouch Editor编程软件手册 doc

说 : 荀 子 极 偏 驳, 只 一 句 性 恶, 大 本 已 失 5 朱 熹 说 : 荀 扬 不 惟 说 性 不 是, 从 头 到 底 皆 不 识 6 采 取 的 都 是 这 种 理 论 框 架 另 一 种 理 论 框 架 始 于 20 世 纪 前 期, 这 便 是 诸 子 学 研 究 的 框 架

第11章 可调内核参数

<5B BECBB0EDB8AEC1F25D312D34B0AD5FC3E2BCAEBCF6BEF7C0DAB7E F31702E504446>

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

Transcription:

异常控制流 : 信号与 非本地跳转 ECF: Signals & Nonlocal Jumps 罗世通元培学院 2018 年年 12 月 6 日 1

为什什么需要信号? Simple Shell shellex.c Foreground job child process execve shell command fork waitpid Background job child process execve zombie (as long as its parent process is running) shell command fork 需要 一种消息机制, 后台执 行行的 子进程结束后, 通知 父进程, 及时将其回收 否则只要 父进程不不结束, 子进程就会成为僵 尸进程驻留留在内存 里里浪费资源 2

定义 Linux 信号 : 是 一条 小消息, 通知进程系统中发 生了了某种类型的事件 是 一种更更 高层的软件形式异常, 允许进程和内核中断其他进程 ECF 异步 (Async) 中断 (Interrupts) 信号 (Signals) 陷阱 (Traps) 1. 异步的, 外 生的异常, 不不是由进程 自身某条指令导致的 2. 由进程处理理, 与其它类型的异常不不同 ( 系统内核处理理 ) 同步 (Async) 故障 (Faults) 终 止 (Aborts) 可以由内核发出, 也可以由其他某个进程发出 每个信号与 一个整数相对应 (1-30) SIGINT (2) SIGKILL (9) SIGSEGV (11) SIGALRM (14) SIGCHLD (17) SIGTSTP (14) SIGFPE (8) 信号消息只携带信号的类型这 一信息 3

Final 2014

发送信号 内核位每个进程维护了了 一个 pending 位向量量, 只要该进程被传送了了 一个类型为 k 的信号, 那么向量量的第 k 位就会被设置为 1. 当 一个进程接收了了类型 k 的信号, 那么向量量的第 k 位就会被设置为 0. 因此, 只能知道是否有未被接收的某种类型的信号, 无法知道有多少个信号 在进程接收某种信号前, 多次发送某种类型的信号与发送 一次的效果是相同的 系统调 用作 用参数特别说明返回值说明 pid_t getpgrp(void); int setpgid(pid_t pid, pid_t pgid); 返回当前进程所属的进程组 ID 将进程 pid 的进程组改为 pgid - - pid=0, 使 用当前进程 pid; pgid=0, 使 用 pid 指定的进程 pid 作为 pgid. - int kill(pid_t pid, int sig); 向进程 / 进程组发送信号 sig pid=0, 以当前进程所属进程组所有进程为 目标 ; pid<0, 以进程组 (-pid) 为 目标. - unsigned int alarm(unsigned int secs); 在 secs 秒后向 自身发送 SIGALRM - 取消还没有到时间的闹钟并返回其秒数 5

Final 2015

Final 2014

人为发送信号的 方法 /bin/kill -X PID 键盘 : Ctrl-C(SIGINT) Ctrl-Z(SIGTSTP) int kill(pid_t pid, int sig); 8

接收信号 When: 内核把进程 p 从内核模式切换到 用户模式时 ( 上下 文切换或者从系统调 用返回 ) How: 内核检查进程 p 未被阻塞的待处理理信号集合 (pending & ~blocked), 如果集合 非空, 则选择某个信号 ( 通常是最 小的信号 ), 强制 p 接收 What: 触发进程采取某些 行行为 信号预定义的默认 行行为 : 终 止 (SIGKILL, SIGINT) 停 止 (SIGTSTP, SIGSTOP) 忽略略 (SIGCHLD) 进程通过注册信号 handler 以 自定义 行行为覆盖默认 行行为,SIGSTOP, SIGKILL 的默认 行行为不不能被修改 最后, 如果可能, 控制传递回 p 逻辑控制流的下 一条指令 9

阻塞信号 接收信号 : 内核检查进程 p 未被阻塞的待处理理信号集合 (pending & ~blocked), 如果集合 非空, 则选择某个信号 ( 通常是最 小的信号 ), 强制 p 接收 修改阻塞信号的条件即修改 blocked 位向量量 相关的系统调 用 : handler_t *signal(int signum, handler_t *handler); /* 出错返回 SIG_ERR*/ void sigprocmask(int how, const sigset_t *set, sigset_t *oldset); int how: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK void sigemptyset(sigset_t *set); void sigfillset(sigset_t *set); void sigaddset(sigset_t *set, int signum); void sigdelset(sigset_t *set, int signum); int sigismember(const sigset_t *set, int signum); 隐式阻塞信号 : 内核默认阻塞当前正在处理理的信号类型的待处理理信号 10

安全的信号处理理 必要性 : 主程序和信号处理理程序并发运 行行 Main process SIGINT handler I1: jerrysbalance -= 50; SIGINT Ih: print(jerrysbal+tomsbal) I2: tomsbalance += 50; Inconsistency 主程序处理理 一个 转账 事务 : 从 Jerry 的账户转 50 元到 Tom 的账户, 该事务被分为 2 条指令 I1 I2. I1 结束后 I2 开始前, 主程序被 SIGINT 打断, 进 入处理理程序, 处理理程序输出所有 人账户余额的总和, 此时的数据是不不 一致的 (Inconsistent) 11

安全的信号处理理 必要性 : 主程序和信号处理理程序并发运 行行 对策 : G0. 处理理程序尽可能简单, 做少错少, 可以设置全局标志 立即返回, 让主程序去做主要的事情 G1. 在处理理程序中只调 用异步信号安全的函数 (Async-Signal-Safe) 异步信号安全函数 : (1) 可重 入 ( 只访问局部变量量 ) 的函数. (2) 不不能被信号处理理程序中断的函数 G2. 保存和恢复 errno 许多 Linux 异步信号安全函数都会在出错返回时设置全局变量量 errno. G3. 阻塞所有信号, 保护对全局共享数据的访问 如果处理理程序和主程序需要访问同 一个全局数据结构, 应该在访问前 一刻阻塞所有信号, 保证当前程序能够不不被打断地完成对该数据的全部操作 G4. 用 volatile 声明全局变量量 避免编译器器优化时把这个全局变量量 一直放在寄存器器中 G5. 用 sig_atomic_t 声明标志 标志可 用来标记已收到某种信号, 主程序通过判断标志的变化执 行行相关的操作 (G0) 使 用 sig_atomic_t 关键字修饰全局变量量可以保证对这 一变量量的单次读 / 写是不不可中断的 12

同步流避免并发错误 Foreground job child process execve shell command fork waitpid Foreground job (Explicitly Waiting for Signals) child process execve shell command fork wait for SIGCHLD 13

同步流避免并发错误 while (!pid) ; child process execve no SIGCHLD SIGCHLD Handler sets pid=0 loop breaked CPU 空转 浪费资源 shell command fork pid=fork() check if pid==0? yes while (!pid) sleep(1); shell child process command fork pid=fork() execve sleep SIGCHLD SIGCHLD Handler sets pid=0 loop breaked no check if pid==0? yes 太慢 14

同步流避免并发错误 while (!pid) pause(); shell child process block SIGCHLD fork pid=fork() execve unblock pause SIGCHLD no SIGCHLD Handler sets pid=0 SIGCHLD has been handled (pending[17] set to zero) just before pause() is called yes check if pid==0? 潜在冲突 while (!pid) sigsuspend(&prev); shell child process block SIGCHLD fork pid=fork() execve sigsuspend(prev) SIGCHLD no yes check if pid==0? SIGCHLD will be handled right after sigsuspend is called and pid will be set to 0 Note that SIGCHLD is not masked by prev 15

同步流避免并发错误 man pause Pause is made obsolete by sigsuspend

非本地跳转 Nonlocal Jumps setjmp / longjmp int setjmp(jmp_buf j); 标记跳转 目的地将标记时的上下 文 ( 寄存器器 PC 栈指针) 存 入 j (jump buffer) 调 用 一次返回两次 : 第 一次是标记时 ( 返回 0), 第 二次是跳转回来时, 返回 一个 自定义的整型 i 函数值不不能赋值给 一个变量量, 但是可以 用在 if switch 语句句中 void longjmp(jmp_buf j, int i); 从 j 恢复上下 文 ( 寄存器器 栈指针 ), 将 %rax 设置为 i 将 PC 设置为 j 中储存的 PC 值 限制 : 只能跳转回正在执 行行的过程中 f1 f2 f3 f1 f2 (returned) f3 17

Final 2016

谢谢