29,UC(08)

/*
  达内学习 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个数读进来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值