signalfd创建一个用于所接收信号的文件描述符intsignalfd(intfd,constsigset_t*mask,intflags);结构signalfd_siginfo{uint32_tssi_signo;/*信号编号*/int32_tssi_errno;/*错误编号(未使用)*/int32_tssi_code;/*信号代码*/uint32_tssi_pid;/*发送者的PID*/uint32_tssi_uid;/*发送者的真实UID*/int32_tssi_fd;/*文件描述符(SIGIO)*/uint32_tssi_tid;/*内核定时器ID(POSIX定时器)*/uint32_tssi_band;/*波段事件(SIGIO)*/uint32_tssi_overrun;/*POSIX定时器溢出计数*/uint32_tssi_trapno;/*引起信号的陷阱编号*/int32_tssi_status;/*退出状态或信号(SIGCHLD)*/int32_tssi_int;/*sigqueue(3)发送的整数*/uint64_tssi_ptr;/*sigqueue(3)发送的指针*/uint64_tssi_utime;/*用户CPU消耗时间(SIGCHLD)*/uint64_tssi_stime;/*系统CPU时间消耗(SIGCHLD)*/uint64_tssi_addr;/*生成信号的地址(对于硬件生成的信号)*/uint8_tpad[X];/*填充大小为128字节(允许将来添加其他字段)*/};intmain(){sigset_t掩码;int信号;结构signalfd_siginfossinfo;sigemptyset(&掩码);sigaddset(&mask,SIGINT);如果(sigprocmask(SIG_BLOCK,&mask,NULL)<0)print_err("sigprocmaskerr");如果((sigfd=signalfd(-1,&mask,0))<0)print_err("signalfderr");while(1){intlen=read(sigfd,&ssinfo,sizeof(ssinfo));if(len<0)print_err("读取错误");如果(ssinfo.ssi_signo==SIGINT)printf("getSIGINT.\n");}return0;}eventfdinteventfd(unsignedintinitval,intflags);内核相关数据结构structeventfd_ctx{structkrefkref;/*文件计数,用于get/put*/wait_queue_head_twqh;/*这用于在用户模式下存储进程等待项,它的通知机制是可能的*//**每次对一个write(2)执行eventfd,正在写入的__u64的*值被添加到“count”,并且在“wqh”上执行*唤醒。read(2)会将“count”*值返回给用户空间,并将“count”重置为零。内核*端eventfd_signal()也添加到“计数”计数器并*发出唤醒。*/__u64计数;/*计算器,读就是取自然后清空,写就是把值加上*/unsignedintflags;/*使用来存储释放阻塞/非阻塞标志或者是O_CLOEXEC之类的东西*/};值得注意的flagEFD_SEMAPHORE(sinceLinux2.6.30)IfEFD_SEMAPHOREwasnotspecifiedandtheeventfdcounterhasanonzerovalue,thenaread(2)返回包含该值的8个字节,并且计数器的值重置为零。如果指定了EFD_SEMAPHORE并且eventfd计数器具有非零值,则read(2)返回包含值1的8个字节,并且计数器的值为减1。如果在调用read(2)时eventfd计数器为零,则调用要么阻塞,直到计数器变为非零(此时,read(2)继续执行上面描述的)或者如果文件描述符被设置为非阻塞则失败并返回错误EAGAIN.voidfun(intevent_fd){intepoll_fd=epoll_create1(EPOLL_CLOEXEC);//EPOLL_NONBLOCK结构epoll_event事件;constintSIZE=1024;结构epoll_eventready_events[SIZE];intready_nums;memset(&event,0,sizeof事件);event.events=EPOLLIN;event.data.fd=event_fd;epoll_ctl(epoll_fd,EPOLL_CTL_ADD,event_fd,&event);for(;;){ready_nums=epoll_wait(epoll_fd,ready_events,SIZE,-1);for(inti=0;i
