1. 一、pause()的使用
  2. #include <unistd.h>
  3. int pause(void);
  4. 功能:等待信号的到来
  5. 返回值:
  6. - 错误 errno被设置
  7. 只有在信号处理函数执行完毕的时候才返回。
  8.  
  9. 利用所学的知识,编码实现sleep函数的功能。
  10. unsigned int psleep(unsigned int seconds);
  11. 代码参见 psleep.c
  12.  
  13. 二、信号从产生到处理的全过程
  14. 、进程正在运行,按下ctrl+c
  15. ctrl+c是硬件中断,使用进程切换到内核态。
  16. 、驱动程序将ctrl+c键解释为2号信号
  17. 、在内核态中将进程的PCB2号信号设置为1.继续执行
  18. 、当进程从内核态回到用户态的时候,检测进程的PCB中有哪些信号到达?如果没有信号到达,直接切换回用户态。如果有信号到达,调用信号的相关处理函数。信号处理函数执行完毕的时候,调用sigreturn()返回到内核态。继续第五步。
  19.  
  20. 三、可重入函数
  21. 信号处理函数的栈帧是私有的。
  22. 信号处理函数和进程的执行是异步的。
  23. 如果这两条执行路线出现对共享资源的竞争,这事就大了。
  24. 尽量避免竞争。
  25. 使我的函数尽量不去访问栈帧以外的资源。
  26. 如果函数中使用了全局变量、静态的局部变量、malloc的内存。那么这个函数就是不可重入函数。
  27. 可重入函数只能访问栈帧里的内容。如果这个函数只有地洞局部变量,那么这个函数就是可重入函数。
  28. 举例说明 信号处理函数和进程竞争共享资源。
  29. 代码参见 count.c
  30.  
  31. 四、作业
  32. 进程组 有一个或多个进程
  33. 父进程 子进程 孙子进程
  34.  
  35. 作业分为前台作业和后台作业,前台作业只有一个,后台作业有多个。
  36. 按键产生的信号只能发送给前台作业。
  37.  
  38. 将前台作业转换为后台作业
  39. ctrl+z
  40. 后台作业转换为前台作业
  41. fg %作业号
  42. 在后台运行作业
  43. bg %作业号
  44. 查看后台作业
  45. jobs
  46. 在作业启动的时候,直接将作业放到后台执行
  47. 作业&
  48.  
  49. 补充一句:
  50. 子进程结束的时候,子进程向父进程发送SIGCHLD信号,父进程收到,就去收尸。
  51.  
  52. 五、使用setitimer()设置计时器
  53. 系统计时器做了解
  54. 系统运行一个进程时候,进程消耗的时间包含三部分
  55. 用户时间 进程消耗在用户态的时间
  56. 内核时间 进程消耗在内核态的时间
  57. 睡眠时间 进程消耗在等待I/O、睡眠等不被调度的时间
  58. 内核为系统中的每个进程维护三个计时器
  59. 真实计时器 统计进程的执行时间
  60. 虚拟计时器 统计进程的用户时间
  61. 实用计时器 统计进程的用户时间和内核时间
  62.  
  63. 这三个计时器除了统计功能以外,还可以按照自己的规则,以定时器的方式工作,向进程周期性的发送信号。
  64.  
  65. 利用这个功能设计一个计时器
  66. setitimer()
  67. #include <sys/time.h>
  68. int setitimer(int which, const struct itimerval *new_value,
  69. struct itimerval *old_value);
  70. 功能:设置定时器的间隔值
  71. 参数:
  72. which
  73. ITIMER_REAL
  74. ITIMER_VIRTUAL
  75. ITIMER_PROF
  76.  
  77. new_value:指定了定时器的新值
  78. old_value:保存了定时器的旧值
  79. 返回值:
  80. 成功
  81. - 错误 errno被设置
  82.  
  83. ITIMER_REAL:真实 SIGALRM
  84. ITIMER_VIRTUAL:虚拟 SIGVTALRM
  85. ITIMER_PROF:实用 SIGPROF
  86.  
  87. struct itimerval{
  88. struct timeval it_interval; /* next value */
  89. struct timeval it_value; /* current value */
  90. };
  91. struct timeval{
  92. long tv_sec; /* seconds */
  93. long tv_usec; /* microseconds */
  94.  
  95. };
  96. 微秒
  97. 1秒=1000毫秒
  98. 1毫秒=1000微秒
  99.  
  100. 举例说明 编写代码实现定时器,起始时间是进程启动3秒,然后每隔0.5秒发送一个SIGALRM信号。
  101. 代码参见 timer.c
  102.  
  103. 信号结束了
  104.  
  105. 六、system v IPC
  106. 消息队列 共享内存 信号量集
  107.  
  108. 在内核管理的内存,用于进程间通讯的内存,称为system v ipc object
  109. 操作系统需要管理这些对象。
  110. 如何查看当前系统里有哪些对象?
  111. ipcs
  112.  
  113. 在操作系统中这些对象,每一个都有自己的id。便于操作系统的管理。
  114. 在用户态需要获取这些对象的id
  115. 获取这些对象的id。需要在用户态有一个键值(唯一的)
  116. 将键值和id绑定,这样就可以获取到对象的id
  117.  
  118. 如何获取这个键值?
  119. ftok()
  120. #include <sys/types.h>
  121. #include <sys/ipc.h>
  122. key_t ftok(const char *pathname, int proj_id);
  123. 功能:获取system v ipc的一个键值 key
  124. 参数:
  125. pathname:指定一个文件名,这个文件是存在的,可访问的
  126. proj_id:必须是非0.取这个数的有效低8位。
  127. 返回值:
  128. - 错误 errno被设置
  129. 返回一个key值。
  130.  
  131. 举例说明 使用ftok()获取一个键值
  132. 代码参见ftok.c
  133.  
  134. 消息队列
  135. 从系统中获取一个消息队列。如果系统里没有,创建消息队列,将这个消息队列的id给我返回。如果有这个消息队列,返回id即可。
  136.  
  137. msgget()
  138. #include <sys/types.h>
  139. #include <sys/ipc.h>
  140. #include <sys/msg.h>
  141. int msgget(key_t key, int msgflg);
  142. 功能:获取一个消息队列的id
  143. 参数:
  144. keyftok()的返回值
  145. msgflg
  146. IPC_CREAT:如果不存在创建,存在,不创建
  147. IPC_EXCL:如果和IPC_CREAT一起指定,存在的时候,报错。
  148. mode:指定了消息队列的权限
  149. 返回值:
  150. - 错误 errno被设置
  151. 返回消息队列的id
  152.  
  153. 举例说明 使用msgget()从内核获取消息队列
  154. 代码参见msgget.c
  155.  
  156. 向消息队列中发送消息和从消息队列获取消息
  157. msgsnd()
  158. #include <sys/types.h>
  159. #include <sys/ipc.h>
  160. #include <sys/msg.h>
  161. int msgsnd(int msqid, const void *msgp, \
  162. size_t msgsz, int msgflg);
  163. 功能:向消息队列发送消息
  164. 参数:
  165. msqid:指定了存放消息的消息队列的id
  166. msgp:指向了消息的地址
  167. msgsz:指定了消息内容的长度
  168. msgflg
  169. IPC_NOWAIT:非阻塞
  170. 阻塞
  171. 返回值:
  172. 成功
  173. - 失败 errno被设置
  174.  
  175. 将一份拷贝追加到消息队列中
  176.  
  177. ssize_t msgrcv(int msqid, void *msgp,\
  178. size_t msgsz, long msgtyp,int msgflg);
  179. 功能:从消息队列接收消息
  180. 参数:
  181. msqid:指定了消息队列的id
  182. msgp:指向了消息的地址
  183. msgsz:指定了消息内容的长度
  184. msgtyp:指定了消息的类型
  185. msgflg
  186. IPC_NOWAIT:没有消息的时候,立即返回错误 errno被设置
  187. 没有消息的时候,阻塞等待
  188.  
  189. 返回值:
  190. - 失败 errno被设置
  191. 成功 返回实际拷贝到mtext中的字节数。
  192.  
  193. 需要用户自定义这个类型
  194. struct msgbuf {
  195. long mtype; /* message type, must be > 0 */
  196. char mtext[]; /* message data */
  197. };
  198. typedef struct msgbuf msgb_t;
  199. msgb_t *st=malloc(sizeof(msgb_t)+strlen(mtext)-);
  200. st->mtext
  201.  
  202. 举例说明 两个进程通过消息队列实现进程间的通讯。
  203. 代码参见 send.c recv.c
  204.  
  205. 总结:
  206. 一、pause()函数的使用
  207. 二、信号从产生到处理的整个过程
  208. 三、可重入函数
  209. 四、作业 前台作业和后台作业
  210. 五、使用setitimer()实现定时器
  211. 六、进程间通讯 system v ipc
  212. 消息队列

pause、jobs、setitimer(2)、system v ipc(day12)的更多相关文章

  1. Linux 系统编程 学习:04-进程间通信2:System V IPC(1)

    Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...

  2. Linux 系统编程 学习:05-进程间通信2:System V IPC(2)

    Linux 系统编程 学习:05-进程间通信2:System V IPC(2) 背景 上一讲 进程间通信:System V IPC(1)中,我们介绍了System IPC中有关消息队列.共享内存的概念 ...

  3. linux网络编程之system v信号量(一)

    今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...

  4. System V 机制(转)

    引言 UNIX 内核管理的进程自主地操作,从而产生更稳定的系统.然而,每个开发人员最终都会遇到这样的情况,即其中一组进程需要与另一组进程通信,也许是为了交换数据或发送命令.这种通信称为进程间通信(In ...

  5. linux网络编程之system v信号量(二)

    今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...

  6. 第三十二章 System V信号量(三)

    n哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,n哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,n平时哲学家进行思考,饥饿时便试图取其左.右最靠近 ...

  7. 第三十章 System V信号量(一)

    信号量 信号量和P.V原语由Dijkstra(迪杰斯特拉)提出 信号量: 互斥: P.V在同一进程中 同步: P.V在不同进程中 信号量值含义 S>0 : S表示可用资源个数 S=0 : 表示无 ...

  8. 第三十一章 System V信号量(二)

    用信号量实现进程互斥示例 #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #inclu ...

  9. System V IPC 之消息队列

    消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...

随机推荐

  1. linux下华为HSPA模块MU609的驱动问题

    环境: CPU: s3c2416 Linux: 3.6 模块: HUAWEI MU609 SIM卡: 移动3G卡.移动4G卡 首先,拿到MU609模块后,第一要做的是对模块进行一些熟悉与了解,那么资料 ...

  2. HTML标签列表

    HTML參考手冊 按功能类别排列 New : HTML5 中的新标签. 标签 描写叙述 <!--...--> 定义凝视. <!DOCTYPE> 定义文档类型. <a> ...

  3. HDU 5347(MZL&#39;s chemistry-打表)

    MZL's chemistry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. 阻塞、非阻塞、同步、异步IO

    阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用. ...

  5. 实现泛型IEnumerable接口

    用C#实现一个类的IEnumerable接口时有两种方法:1)实现非泛型IEnumerable接口:2)实现泛型IEnumerable(T)接口.如果采用方法1,当集合元素T是值类型时,将涉及到巨多的 ...

  6. Google Chrome调试常用快捷键

    Ctrl+Shift+I调出开发者工具 Ctrl+R刷新(界面显示不清楚,刷新后变清楚)

  7. King(差分约束)

    http://poj.org/problem?id=1364 题意:输入i,n,gt(lt),k; 判断是否存在这样一个序列,从第 i 项加到第 n+i 项的和 <(lt) k 或 >(g ...

  8. lodop多打印一页白纸

    [错误还原]Lodop多张空白页测试2 [错误还原]Lodop多出空白页测试 http://blog.sina.com.cn/s/blog_157ebf1370102wta1.html 上面这个链接是 ...

  9. jquery的ajax同步异步执行

    大家先看一段简单的jquery ajax 返回值的js 代码 function getReturnAjax{  $.ajax({    type:"POST",    http:/ ...

  10. ZOJ2477 Magic Cube

    题目: This is a very popular game for children. In this game, there's a cube, which consists of 3 * 3 ...