pause、jobs、setitimer(2)、system v ipc(day12)
- 一、pause()的使用
- #include <unistd.h>
- int pause(void);
- 功能:等待信号的到来
- 返回值:
- - 错误 errno被设置
- 只有在信号处理函数执行完毕的时候才返回。
- 利用所学的知识,编码实现sleep函数的功能。
- unsigned int psleep(unsigned int seconds);
- 代码参见 psleep.c
- 二、信号从产生到处理的全过程
- 、进程正在运行,按下ctrl+c键
- 、ctrl+c是硬件中断,使用进程切换到内核态。
- 、驱动程序将ctrl+c键解释为2号信号
- 、在内核态中将进程的PCB的2号信号设置为1.继续执行
- 、当进程从内核态回到用户态的时候,检测进程的PCB中有哪些信号到达?如果没有信号到达,直接切换回用户态。如果有信号到达,调用信号的相关处理函数。信号处理函数执行完毕的时候,调用sigreturn()返回到内核态。继续第五步。
- 三、可重入函数
- 信号处理函数的栈帧是私有的。
- 信号处理函数和进程的执行是异步的。
- 如果这两条执行路线出现对共享资源的竞争,这事就大了。
- 尽量避免竞争。
- 使我的函数尽量不去访问栈帧以外的资源。
- 如果函数中使用了全局变量、静态的局部变量、malloc的内存。那么这个函数就是不可重入函数。
- 可重入函数只能访问栈帧里的内容。如果这个函数只有地洞局部变量,那么这个函数就是可重入函数。
- 举例说明 信号处理函数和进程竞争共享资源。
- 代码参见 count.c
- 四、作业
- 进程组 有一个或多个进程
- 父进程 子进程 孙子进程
- 作业分为前台作业和后台作业,前台作业只有一个,后台作业有多个。
- 按键产生的信号只能发送给前台作业。
- 将前台作业转换为后台作业
- ctrl+z
- 后台作业转换为前台作业
- fg %作业号
- 在后台运行作业
- bg %作业号
- 查看后台作业
- jobs
- 在作业启动的时候,直接将作业放到后台执行
- 作业&
- 补充一句:
- 子进程结束的时候,子进程向父进程发送SIGCHLD信号,父进程收到,就去收尸。
- 五、使用setitimer()设置计时器
- 系统计时器做了解
- 系统运行一个进程时候,进程消耗的时间包含三部分
- 用户时间 进程消耗在用户态的时间
- 内核时间 进程消耗在内核态的时间
- 睡眠时间 进程消耗在等待I/O、睡眠等不被调度的时间
- 内核为系统中的每个进程维护三个计时器
- 真实计时器 统计进程的执行时间
- 虚拟计时器 统计进程的用户时间
- 实用计时器 统计进程的用户时间和内核时间
- 这三个计时器除了统计功能以外,还可以按照自己的规则,以定时器的方式工作,向进程周期性的发送信号。
- 利用这个功能设计一个计时器
- setitimer()
- #include <sys/time.h>
- int setitimer(int which, const struct itimerval *new_value,
- struct itimerval *old_value);
- 功能:设置定时器的间隔值
- 参数:
- which:
- ITIMER_REAL:
- ITIMER_VIRTUAL:
- ITIMER_PROF:
- new_value:指定了定时器的新值
- old_value:保存了定时器的旧值
- 返回值:
- 成功
- - 错误 errno被设置
- ITIMER_REAL:真实 SIGALRM
- ITIMER_VIRTUAL:虚拟 SIGVTALRM
- ITIMER_PROF:实用 SIGPROF
- struct itimerval{
- struct timeval it_interval; /* next value */
- struct timeval it_value; /* current value */
- };
- struct timeval{
- long tv_sec; /* seconds */
- long tv_usec; /* microseconds */
- };
- 秒 微秒
- 1秒=1000毫秒
- 1毫秒=1000微秒
- 举例说明 编写代码实现定时器,起始时间是进程启动3秒,然后每隔0.5秒发送一个SIGALRM信号。
- 代码参见 timer.c
- 信号结束了
- 六、system v IPC
- 消息队列 共享内存 信号量集
- 在内核管理的内存,用于进程间通讯的内存,称为system v ipc object
- 操作系统需要管理这些对象。
- 如何查看当前系统里有哪些对象?
- ipcs
- 在操作系统中这些对象,每一个都有自己的id。便于操作系统的管理。
- 在用户态需要获取这些对象的id。
- 获取这些对象的id。需要在用户态有一个键值(唯一的)
- 将键值和id绑定,这样就可以获取到对象的id。
- 如何获取这个键值?
- ftok()
- #include <sys/types.h>
- #include <sys/ipc.h>
- key_t ftok(const char *pathname, int proj_id);
- 功能:获取system v ipc的一个键值 key
- 参数:
- pathname:指定一个文件名,这个文件是存在的,可访问的
- proj_id:必须是非0.取这个数的有效低8位。
- 返回值:
- - 错误 errno被设置
- 返回一个key值。
- 举例说明 使用ftok()获取一个键值
- 代码参见ftok.c
- 消息队列
- 从系统中获取一个消息队列。如果系统里没有,创建消息队列,将这个消息队列的id给我返回。如果有这个消息队列,返回id即可。
- msgget()
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- int msgget(key_t key, int msgflg);
- 功能:获取一个消息队列的id
- 参数:
- key:ftok()的返回值
- msgflg:
- IPC_CREAT:如果不存在创建,存在,不创建
- IPC_EXCL:如果和IPC_CREAT一起指定,存在的时候,报错。
- mode:指定了消息队列的权限
- 返回值:
- - 错误 errno被设置
- 返回消息队列的id
- 举例说明 使用msgget()从内核获取消息队列
- 代码参见msgget.c
- 向消息队列中发送消息和从消息队列获取消息
- msgsnd()
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- int msgsnd(int msqid, const void *msgp, \
- size_t msgsz, int msgflg);
- 功能:向消息队列发送消息
- 参数:
- msqid:指定了存放消息的消息队列的id。
- msgp:指向了消息的地址
- msgsz:指定了消息内容的长度
- msgflg:
- IPC_NOWAIT:非阻塞
- 阻塞
- 返回值:
- 成功
- - 失败 errno被设置
- 将一份拷贝追加到消息队列中
- ssize_t msgrcv(int msqid, void *msgp,\
- size_t msgsz, long msgtyp,int msgflg);
- 功能:从消息队列接收消息
- 参数:
- msqid:指定了消息队列的id
- msgp:指向了消息的地址
- msgsz:指定了消息内容的长度
- msgtyp:指定了消息的类型
- msgflg:
- IPC_NOWAIT:没有消息的时候,立即返回错误 errno被设置
- 没有消息的时候,阻塞等待
- 返回值:
- - 失败 errno被设置
- 成功 返回实际拷贝到mtext中的字节数。
- 需要用户自定义这个类型
- struct msgbuf {
- long mtype; /* message type, must be > 0 */
- char mtext[]; /* message data */
- };
- typedef struct msgbuf msgb_t;
- msgb_t *st=malloc(sizeof(msgb_t)+strlen(mtext)-);
- st->mtext
- 举例说明 两个进程通过消息队列实现进程间的通讯。
- 代码参见 send.c recv.c
- 总结:
- 一、pause()函数的使用
- 二、信号从产生到处理的整个过程
- 三、可重入函数
- 四、作业 前台作业和后台作业
- 五、使用setitimer()实现定时器
- 六、进程间通讯 system v ipc
- 消息队列
pause、jobs、setitimer(2)、system v ipc(day12)的更多相关文章
- Linux 系统编程 学习:04-进程间通信2:System V IPC(1)
Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...
- Linux 系统编程 学习:05-进程间通信2:System V IPC(2)
Linux 系统编程 学习:05-进程间通信2:System V IPC(2) 背景 上一讲 进程间通信:System V IPC(1)中,我们介绍了System IPC中有关消息队列.共享内存的概念 ...
- linux网络编程之system v信号量(一)
今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...
- System V 机制(转)
引言 UNIX 内核管理的进程自主地操作,从而产生更稳定的系统.然而,每个开发人员最终都会遇到这样的情况,即其中一组进程需要与另一组进程通信,也许是为了交换数据或发送命令.这种通信称为进程间通信(In ...
- linux网络编程之system v信号量(二)
今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...
- 第三十二章 System V信号量(三)
n哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,n哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,n平时哲学家进行思考,饥饿时便试图取其左.右最靠近 ...
- 第三十章 System V信号量(一)
信号量 信号量和P.V原语由Dijkstra(迪杰斯特拉)提出 信号量: 互斥: P.V在同一进程中 同步: P.V在不同进程中 信号量值含义 S>0 : S表示可用资源个数 S=0 : 表示无 ...
- 第三十一章 System V信号量(二)
用信号量实现进程互斥示例 #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #inclu ...
- System V IPC 之消息队列
消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...
随机推荐
- linux下华为HSPA模块MU609的驱动问题
环境: CPU: s3c2416 Linux: 3.6 模块: HUAWEI MU609 SIM卡: 移动3G卡.移动4G卡 首先,拿到MU609模块后,第一要做的是对模块进行一些熟悉与了解,那么资料 ...
- HTML标签列表
HTML參考手冊 按功能类别排列 New : HTML5 中的新标签. 标签 描写叙述 <!--...--> 定义凝视. <!DOCTYPE> 定义文档类型. <a> ...
- HDU 5347(MZL's chemistry-打表)
MZL's chemistry Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 阻塞、非阻塞、同步、异步IO
阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用. ...
- 实现泛型IEnumerable接口
用C#实现一个类的IEnumerable接口时有两种方法:1)实现非泛型IEnumerable接口:2)实现泛型IEnumerable(T)接口.如果采用方法1,当集合元素T是值类型时,将涉及到巨多的 ...
- Google Chrome调试常用快捷键
Ctrl+Shift+I调出开发者工具 Ctrl+R刷新(界面显示不清楚,刷新后变清楚)
- King(差分约束)
http://poj.org/problem?id=1364 题意:输入i,n,gt(lt),k; 判断是否存在这样一个序列,从第 i 项加到第 n+i 项的和 <(lt) k 或 >(g ...
- lodop多打印一页白纸
[错误还原]Lodop多张空白页测试2 [错误还原]Lodop多出空白页测试 http://blog.sina.com.cn/s/blog_157ebf1370102wta1.html 上面这个链接是 ...
- jquery的ajax同步异步执行
大家先看一段简单的jquery ajax 返回值的js 代码 function getReturnAjax{ $.ajax({ type:"POST", http:/ ...
- ZOJ2477 Magic Cube
题目: This is a very popular game for children. In this game, there's a cube, which consists of 3 * 3 ...