LinuxC 进程间通信 --- 信号

信号 -- 实现异步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# 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值