/*
达内学习 UC day09 2013-10-14
*/
1 默认,基本推出进程
2 忽略 当信号不存在
3 自定义处理函数
信号处理方式可以通过两个函数:signal() sigaction()(改变设置)
信号发送函数
raise() kill() alarm() sigqueue()
sleep() -> 时间到了或者 有非忽略信号来sleep 终止
usleep() ->以微秒围坐休眠时间单位的函数,不被信号打断
kill() 发送信号的最常用函数
int kill(pid_t pidmint signo)
pid是接受信号,进程的PID,signo 是发送哪个信号
发送成功返回0,失败返回-1
pid取值包括:
> 0 给制定进程(PID=参数)发信号
== 0 给和发送进程同组的进程 发信号
== -1 给任意进程发信号
< -1 给进程组ID是 -pid的进程 发信号
注: 发送信号时,接受进程必须是有发送权限的进程
kill -0 进程PID 可以测试是否有发送权限
killall 命令名称 可以杀死所有该名字的进程
alarm() 函数 其实不算信号发送函数,这个函数一段时间以后产生一个信号,发给本进程
alarm()函数其实是一个闹钟,闹钟效果就是一段时间以后产生信号SIGALRM,可以通过注册SIGALRM信号的处理函数完成计划。
alarm()在设置闹钟时,如果之前有没有到时间的闹钟,返回之前闹钟剩余的时间(秒数)如果之前没有没到时间的闹钟,返回0, alarm(0) 取消闹钟
信号集
long long int -64 位
类型是sigset_t 可以表示多个信号
集合必须提供的函数:新增元素、删除元素、查询元素
sigemptyset() 清空信号集(全部删除) 二进制置0
sigfillset() 填充所有信号 全部置1
sigaddset() 新增一个信号,二进制位置1
sigdelset() 删除一个信号,二进制位置0
sigismember() 察看是否有某个信号
信号屏蔽 在一段时间内屏蔽某些信号(暂时不处理)
在执行某些关键代码时,不希望程序被信号打断 但是没有办法控制信号的到来时间,,所以用信号屏蔽解决问题,信号屏蔽步骤
步骤:
1 在执行关键代码时屏蔽信号
2 执行关键代码
3 执行完毕,解除信号屏蔽
函数sigprocmask() 用于设置信号屏蔽字,可以屏蔽信号
第一个参数how 是信号屏蔽的方式
SIG_BLOCK 在原有基础上加上传入的信号
ABC + CDE -> ABCDE
SIG_UNBLCOK 在原有基础上减去
SIG_SETMASK 与原来无关,直接屏蔽传入的信号 (最常用)
第二个参数就是需要屏蔽的信号集,第三个参数用于接受之前屏蔽的信号集合
信号处理方式的注册函数 sigaction()增强版 但应用中多用signal()
int sigaction(int signum,struct sigaction* act,struct sigaction *oldact);
struct sigaction
{
void (*sa_handler) (int);
void(*sa_sigaction)(int ,siginfo_t*,void*);
sigset_t sa_mask;
int sa_flags;
}
sa_handler是信号处理函数
sa_sigaction 是信号处理函数,sa_flags 设置为SA_SIGINFO时,取代sa_hander作为信号处理函数
sa_mask 在信号处理函数执行期间,屏蔽的信号
sa_flags 信号处理的标识
Unix/Linux的信号应用 -计时器
每个进程都有三个计时器,真实计时器,虚拟计时器,实用计时器。最常用的是真实计时器
真实计时器: 每隔一段时间产生一个SIGALRM信号
函数setitimer()/getitimer()可以设置/获取 计时器
==================从现在开始,学习中心理论转向应用。===============
Unix应用之 - 进程间通信(IPC)
IPC方式: 文件,信号,管道,共享内存,消息队列,信号量集(与信号无关),socket网络
其中共享内存,消息队列,信号量集 统称XSI IPC 遵循相同的规范
IPC之 管道
管道是Unix/Linux 最古老的IPC方式,但目前已经不怎么用。管道用有名管道和无名管道。管道是通过 管道文件 做媒介进行IPC的。
有名管道:程序员建立一个有管道文件名的管道文件
无名管道:内核建立管道文件
有名管道 已经随意使用,无名管道只能用于fork()创建的父子进程之间的通信。
管道文件有特殊的命令:mkfifo xx.pipe或使用函数mkfifo()
touch 或open()不可能建立管道文件
管道文件只是交互的媒介 不会真正存储数据 如果管道不畅通(有读有写) 会阻塞
练习:写一个pipea.c 向管道文件写入0-100的整数。在写一个pipeb.c,把100个数读进来。