信号 -- 实现异步IO操作
1、设置信号的处理函数
2、设置SIGIO信号由哪个进程接收
3、设置可以异步读取
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
int fd;
void read_msg(int sig)
{
int cor;
read(fd, &cor, sizeof(cor));
printf("cor = %d\n", cor);
}
int main(int argc, char const *argv[])
{
fd = open("/dev/input/mouse0", O_RDWR);
// 1、设置信号的处理函数
signal(SIGIO, read_msg);
// sighandler_t signal(int signum,sighandler_t handler);
// handler 是一个函数,必须有一个int类型的参数(接收到的信号代码),本身类型是void
fcntl(fd, F_SETOWN, getpid()); // 2、设置SIGIO信号由哪个进程接收
int flag;
flag = fcntl(fd, F_GETFL);
flag = flag | O_ASYNC; // 3、设置可以异步读取
fcntl(fd, F_SETFL, flag);
// F_GETFL 获取文件打开方式的标志,标志值含义与open调用一致
while (1)
{
printf("hello world\n");
sleep(1);
}
return 0;
}
运行结果:
root@GodFather:/home/superlan/C_Language/interprocess_communication# ./a.out
hello world
hello world
cor = 9
hello world
cor = 8
hello world
hello world
^C
root@GodFather:/home/superlan/C_Language/interprocess_communication#