#include "common.h"
void sig_io(int sig);
int fd;
int main(void)
{
fd = open("/dev/input/mouse0", O_RDONLY);
ERROR(fd < 0, "open mouse0", err1);
//第一步,注冊信號處理函數(shù)
signal(SIGIO, sig_io);
//第二步,設(shè)置異步IO的所有權(quán),告訴系統(tǒng)當信號發(fā)生時發(fā)給哪個進程
fcntl(fd, F_SETOWN, getpid());
//第三步,將該文件描述符設(shè)置異步模式
int flag = fcntl(fd, F_GETFL);
flag |= O_ASYNC;
fcntl(fd, F_SETFL, flag);
while(1)
{
sleep(1);
}
return 0;
err1:
return -1;
}
void sig_io(int sig)
{
char buf[1024];
bzero(buf, 1024);
read(fd, buf, 1024);
printf("buf:%s\n", buf);
}
如果對同一個信號加入兩個文件描述符,會出現(xiàn)問題
#include "common.h"
void sig_io(int sig);
int fd;
int main(void)
{
fd = open("/dev/input/mouse0", O_RDONLY);
ERROR(fd < 0, "open mouse0", err1);
//第一步,注冊信號處理函數(shù)
signal(SIGIO, sig_io);
//第二步,設(shè)置異步IO的所有權(quán),告訴系統(tǒng)當fd這個設(shè)備發(fā)生信號時發(fā)給哪個進程
/*
在同一個進程中,對多個文件描述符設(shè)置了異步IO,當信號發(fā)生時,進程不知道
是哪個設(shè)備發(fā)來的信號,也就不知道應(yīng)該去讀哪個設(shè)備
*/
fcntl(fd, F_SETOWN, getpid());
fcntl(0, F_SETOWN, getpid());
//第三步,將該文件描述符設(shè)置異步模式
int flag = fcntl(fd, F_GETFL);
flag |= O_ASYNC;
fcntl(fd, F_SETFL, flag);
flag = fcntl(0, F_GETFL);
flag |= O_ASYNC;
fcntl(0, F_SETFL, flag);
while(1)
{
sleep(1);
}
return 0;
err1:
return -1;
}
void sig_io(int sig)
{
char buf[1024];
bzero(buf, 1024);
read(fd, buf, 1024);
printf("mouse0:%s\n", buf);
bzero(buf, 1024);
read(0, buf, 1024);
printf("stdin:%s\n", buf);
}
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。