uc9
来源:互联网 发布:新旧系统数据迁移方案 编辑:程序博客网 时间:2024/05/16 17:18
回顾:
vfork()+exec系列函数 - 创建子进程的方式
执行全新的代码
vfork() 确保子进程先运行,不会复制 父进程的内存空间,但在调用exec系列函数之前会占用 父进程内存空间。
exec系列函数 可以 执行新的程序,替换以前的代码区、全局区、堆区、栈区。execl() execlp()
waitpid() 让父进程等待子进程,比wait()更灵活
信号 - 其实就是一个整数,被用来实现 软件中断。Linux系统中,1-64(不连续),信号分为可靠信号(34-64)和不可靠信号(1-31)。为了编程的通用性,尽量使用信号的宏定义。信号的处理方式包括:
1 默认处理
2 忽略信号
3 自定义处理函数 - void fa(int signo){ }
设置信号处理方式(注册)用signal()或sigaction()
信号发送函数:raise() kill() alarm() sigqueue
今天:
信号
IPC - 进程间通信(管道)
kill()
int kill(pid_t pid,int sig);
pid 的值 可以是以下4种情况:
> 0 发给进程ID=pid的某个进程
= 0 发给和发送进程同组的所有进程
= -1 发给所有 有发送权限的进程
< -1 发给进程组ID=-pid的进程
killall 进程名称
可以杀死多个同名进程
alarm()
alarm(int sec)是闹钟函数,sec秒之后产生一个SIGALRM信号。
如果多次调用alarm(),后面的闹钟会替换前面的。
如果sec = 0 ,取消所有的闹钟
返回值:
如果alarm()时,以前设置的闹钟还没有执行,会返回之前的闹钟剩余的秒数;如果以前设置的闹钟执行了,或者没有设置,返回0.
信号集
以一个二进制位 代表一个信号,考虑到 扩展的问题,因此 用一个很大的整数 代表 多个信号,这个很大的整数就是信号集,信号集的类型 sigset_t.
集合的必须提供的功能:
增加元素、删除元素、查找元素、取出元素
信号集的功能函数:
sigemptyset() - 清空全部信号(二进制位置0)
sigfillset() - 填满全部信号(二进制位置1)
sigaddset() - 增加一个信号
sigdelset() - 删除一个信号
sigismember()- 判断是否有某个信号(有返回1)
信号屏蔽
在执行某些关键代码时,不希望代码被信号中断。此时可以使用信号屏蔽,信号屏蔽不是阻止信号的到来,而是延后信号的处理(信号来了但不处理)。解除信号屏蔽以后 再处理 来过的信号。设置信号屏蔽字函数:
sigprocmask(int how,sigset_t* new,
sigset_t* old)
参数how是屏蔽方式,有三种:
SIG_BLOCK - 相当于加法在原有的基础加上新的
a b c + c d e -> a b c d e
SIG_UNBLOCK - 相当于减法在原有的基础上减去新的 a b c - c d e -> a b
SIG_SETMASK - 重新设置,与原有的无关
a b c c d e -> c d e
一般使用SIG_SETMASK
参数new是新的屏蔽信号集,old可以把之前的屏蔽信号集保存起来,如果old为NULL就是不保存。
如果保存了old,再次设置信号屏蔽字为old就是取消屏蔽。
(常用信号的知识点over)
sigaction() 可以注册信号的处理方式,功能和signal一样,但sigaction是增强版的signal。
sigqueue() 函数可以发送信号,并且在发送信号的同时 附加 数据。
计时器
Linux系统给每个进程 维护了3个计时器,真实计时器、虚拟计时器和实用计时器。其中真实计时器最常用。真实计时器是每隔一段时间产生一个SIGALRM信号
设置/获取计时器的函数:
setitimer() getitimer()
IPC - 进程间通信
IPC就是两个或者多个进程之间的数据交互。
IPC的方法:
1 文件
2 信号(signal)
3 管道
4 共享内存
5 消息队列(综合练习)
6 信号量集(与今天的信号无关semaphore)
7 网络编程(socket)
....
管道是Unix最古老的IPC方式,现在已很少使用。
4 5 6 用法类似,统称为XSI IPC,遵守相同的规范。
管道分为有名管道和无名管道。有名管道由程序建立管道文件,用于进程间的通信。而无名管道由内核建立管道文件,用于fork()创建的父子进程之间的通信。
管道 是通过 管道文件(媒介) 进行交互的。管道文件和 普通文件有所区别。管道文件是 mkfifo命令创建的或者mkfifo()函数新建,管道文件的后缀 .pipe。
管道文件只是 数据的中转站,不存储数据。因此,只有读写都ok时,才能畅通。(echo cat)
管道的使用和文件一样的,但管道文件的创建必须用mkfifo。
0 0