用户程序中,为了捕获信号,可以使用signal()函数设置相应的处理函数
void (*signal(int signum,void(*handler))(int)))(int);
如果signal调用成功,它返回一个绑定的处理函数最后一次的处理结果值,失败返回SIG_ERR
使用信号实现异步通知的程序如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define MAX_LEN 100
void input_handler(int num)
{
char data[MAX_LEN];
int len;
//读取并输出STDIN_FILENO上的输入
len = read(STDIN_FILENO,&data,MAX_LEN);
data[len] = 0;
printf("input available:%s\n",data);
}
int main()
{
int oflags;
//启动信号驱动机制 即对标准输入文件描述符信号启动
signal(SIGIO,input_handler);
//设置设备文件拥有者为本进程,使得信号被本进程接收
fcntl(STDIN_FILENO,F_SETOWN,getpid());
oflags = fcntl(STDIN_FILENO,F_GETFL);
//控制设备以支持异步通知模式
fcntl(STDIN_FILENO,F_SETFL,oflags | FASYNC);
while(1);
return 0;
}