一、消息队列
unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(也叫做报文队列)则克服了这些缺点。
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式。
进程可以向其中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。
消息队列分两种:
POSIX消息队列以及系统V消息队列 系统V消息队列目前被大量使用
二、信号
1、在终端使用kill -l命令可以查看各种信号
2、信号是可以被捕捉的,但是有些信号是不能被捕捉,例如kill -9 是不允许被捕捉的。
3、可以用signal函数进行捕捉信号。
4、SIGALRM信号:
可以捕捉SIGALRM信号,用来写定时器
alarm用来倒计时。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle_signal(int sigNum)
{
if (sigNum == SIGALRM)
{
printf ("hello\n");
alarm(2); // 重置定时时间
}
}
int main()
{
signal(SIGALRM, handle_signal); // 定时信号
alarm(2); // 定时2秒
while (1);
return 0;
}
5、SIGCHLD信号:
子进程在退出之前会向父进程发SIGCHLD信息。
由于在处理僵尸进程的时候不能使用wait这种阻塞型的函数,因此可以捕捉SIGCHLD信号,在子进程要退出的时候,使用waitpid函数采取非阻塞处理子进程。由于信号的函数只会进行一次,一旦有多个子进程退出时无法全部退出,需要while循环来确定子进程全部退出
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void handle_signal(int sigNum)
{
pid_t pid;
while ((pid = waitpid(-1, NULL, WNOHANG)) > 0)
{
printf ("处理了一个子进程退出信息,子进程的id = %d\n", pid);
}
}
int main()
{
signal(SIGCHLD, handle_signal); // 定时信号
int i;
for (i = 0; i < 10; i++)
{
pid_t pid = fork();
if (0 == pid)
break;
}
while (1);
return 0;
}