2013年11月12日 星期二 09时53分40秒
Today:
信号 - 非负整数,信号0是什么?
信号0 没有特定的用途,主要用来测试是否有发送信号的权限
IPC(进程间通信)- 管道
信号的发送方式:
1.键盘发送(部分信号)
Ctrl+C -> 发送信号2
Ctrl+\ -> 发送信号3
Ctrl+Z -> 发送信号20
2.出错(部分信号)
段错误 -> 信号11 SIGSEGV
总线错误 -> 信号7 SIGBUS
整数除以0 -> 信号8 SIGFPE
3.kill 命令 发送(所有信号)
格式: kill -信号 进程PID
4.函数发送信号(部分/所有信号)
kill() - 发送任意信号给任意进程
raise() - 发送任意信号给本进程
alarm() - 闹钟函数,通过产生闹钟信号工作
sigqueue() - 发送信号的同时还能附加数据
...
sleep()函数被没有忽略的信号打断,此时返回睡眠的剩余秒数
usleep()函数能设置更小的休眠时间,到微秒。usleep()和信号无关
kill() 是发送信号的主体函数,格式:
int kill(pit_t pid,int signo);
参数pid取值的效果和waitpid()效果一样,常见的有:
正数 - 对应PID的进程
-1 - 所有进程(要求有权限)
alarm() - 闹钟函数,一段时间之后产生闹钟信号
信号集 - 信号的集合,多个信号放入信号集
sigset_t -> 一个超大的整数
关于集合的函数:
增加信号 - sigaddset()
删除信号 - sigdelset()
查询信号 - sigismember()
清空信号集 - sigemptyset()
填满信号集 - sigfillset()
有信号就是对应二进制位 置1
无信号就是对应二进制位 置0
位与 用来置0,位或 用来置1,位异或 用来取反
信号屏蔽 - 执行关键代码时,不希望代码被信号打断,可以使用信号屏幕防止信号打断程序,信号屏蔽不是没有信号到来,而是信号来了暂时不处理,等解除了屏蔽后再处理。
信号屏蔽和信号集结合使用,函数:sigprocmask()用于信号屏蔽
int sigprocmask(int how,sigset_t* new,sigset_t* old)
参数:
how有三个值:
SIG_BLOCK: 相当于加法 原有的 + new的
A B C + C D E -> A B C D E
SIG_UNBLOCK: 相当于减法 原有的 - new的
A B C - C D E -> A B
SIG_SETMASK: 相当于赋值 直接等于new的
A B C C D E -> C D E(最常用)
new是需要屏蔽的信号(传入的参数)
old是以前屏蔽的信号(传出的参数),如果以前屏蔽的信号不需要保留,给NULL即可
sigaction() 是增强版的signal(),是signal()的底层实现。
sigaction() 有三个参数,第一个是信号参数,第二个参数指针:
struct sigaction
{
函数指针1 sa_handler;
函数指针2 sa_sigaction;
sigset_t sa_mask;
int sa_flags;
第五个成员忽略;
}
sa_handler 和 sa_sigaction 选其一做信号处理函数,默认情况下使用sa_handler,当sa_flags包含SA_SIGINFO时就是用sa_sigaction做处理函数。
每个信号在执行自己的处理函数期间,都先天屏蔽自身的到来,sa_mask 可以在执行信号处理函数期间,屏蔽其他信号。信号处理函数期间,屏蔽其他信号。信号处理函数执行完毕,屏蔽将被解除
IPC - 进程间通信,就是进程之间的数据交互
常见的IPC方式:
1.文件
2.信号
3.管道
4.共享内存
5.消息队列
6.信号量集(semaphore arrays)
7.网络通信(socket)
......
其中,共享内存,消息队列和信号量集 遵守相同的规范,统称为 XSI IPC。编码上有很多共同点
IPC之管道 - 最古老的IPC方式,现在使用频率极低。管道分为有名管道和无名管道。管道的媒介是一种特殊的文件 - 管道文件
touch命令和open函数都无法创建管道文件,mkfifo命令和mkfifo函数可以创建管道文件。数据交互用读写文件的方式实现.管道文件后缀名 .pipe
Today:
信号 - 非负整数,信号0是什么?
信号0 没有特定的用途,主要用来测试是否有发送信号的权限
IPC(进程间通信)- 管道
信号的发送方式:
1.键盘发送(部分信号)
Ctrl+C -> 发送信号2
Ctrl+\ -> 发送信号3
Ctrl+Z -> 发送信号20
2.出错(部分信号)
段错误 -> 信号11 SIGSEGV
总线错误 -> 信号7 SIGBUS
整数除以0 -> 信号8 SIGFPE
3.kill 命令 发送(所有信号)
格式: kill -信号 进程PID
4.函数发送信号(部分/所有信号)
kill() - 发送任意信号给任意进程
raise() - 发送任意信号给本进程
alarm() - 闹钟函数,通过产生闹钟信号工作
sigqueue() - 发送信号的同时还能附加数据
...
sleep()函数被没有忽略的信号打断,此时返回睡眠的剩余秒数
usleep()函数能设置更小的休眠时间,到微秒。usleep()和信号无关
kill() 是发送信号的主体函数,格式:
int kill(pit_t pid,int signo);
参数pid取值的效果和waitpid()效果一样,常见的有:
正数 - 对应PID的进程
-1 - 所有进程(要求有权限)
alarm() - 闹钟函数,一段时间之后产生闹钟信号
信号集 - 信号的集合,多个信号放入信号集
sigset_t -> 一个超大的整数
关于集合的函数:
增加信号 - sigaddset()
删除信号 - sigdelset()
查询信号 - sigismember()
清空信号集 - sigemptyset()
填满信号集 - sigfillset()
有信号就是对应二进制位 置1
无信号就是对应二进制位 置0
位与 用来置0,位或 用来置1,位异或 用来取反
信号屏蔽 - 执行关键代码时,不希望代码被信号打断,可以使用信号屏幕防止信号打断程序,信号屏蔽不是没有信号到来,而是信号来了暂时不处理,等解除了屏蔽后再处理。
信号屏蔽和信号集结合使用,函数:sigprocmask()用于信号屏蔽
int sigprocmask(int how,sigset_t* new,sigset_t* old)
参数:
how有三个值:
SIG_BLOCK: 相当于加法 原有的 + new的
A B C + C D E -> A B C D E
SIG_UNBLOCK: 相当于减法 原有的 - new的
A B C - C D E -> A B
SIG_SETMASK: 相当于赋值 直接等于new的
A B C C D E -> C D E(最常用)
new是需要屏蔽的信号(传入的参数)
old是以前屏蔽的信号(传出的参数),如果以前屏蔽的信号不需要保留,给NULL即可
sigaction() 是增强版的signal(),是signal()的底层实现。
sigaction() 有三个参数,第一个是信号参数,第二个参数指针:
struct sigaction
{
函数指针1 sa_handler;
函数指针2 sa_sigaction;
sigset_t sa_mask;
int sa_flags;
第五个成员忽略;
}
sa_handler 和 sa_sigaction 选其一做信号处理函数,默认情况下使用sa_handler,当sa_flags包含SA_SIGINFO时就是用sa_sigaction做处理函数。
每个信号在执行自己的处理函数期间,都先天屏蔽自身的到来,sa_mask 可以在执行信号处理函数期间,屏蔽其他信号。信号处理函数期间,屏蔽其他信号。信号处理函数执行完毕,屏蔽将被解除
IPC - 进程间通信,就是进程之间的数据交互
常见的IPC方式:
1.文件
2.信号
3.管道
4.共享内存
5.消息队列
6.信号量集(semaphore arrays)
7.网络通信(socket)
......
其中,共享内存,消息队列和信号量集 遵守相同的规范,统称为 XSI IPC。编码上有很多共同点
IPC之管道 - 最古老的IPC方式,现在使用频率极低。管道分为有名管道和无名管道。管道的媒介是一种特殊的文件 - 管道文件
touch命令和open函数都无法创建管道文件,mkfifo命令和mkfifo函数可以创建管道文件。数据交互用读写文件的方式实现.管道文件后缀名 .pipe