c/c++ llinux epoll系列5 解除epoll_wait状态
程序员文章站
2022-03-10 15:09:19
linux epoll系列5 解除epoll_wait状态 有时候会有解除epoll_wait状态的需求。 实现方法: 1,给执行epoll_wait的程序发signal。 2,使用sockpair。 1,给执行epoll_wait的程序发signal。 c++ include include in ......
linux epoll系列5 解除epoll_wait状态
有时候会有解除epoll_wait状态的需求。
实现方法:
1,给执行epoll_wait的程序发signal。
2,使用sockpair。
1,给执行epoll_wait的程序发signal。
#include <stdio.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <sys/epoll.h> void sigusr1_handler(int sig){ write(fileno(stdout), "signal called\n", 14); } int main(){ int nfds; int epfd; signal(sigusr1, sigusr1_handler); epfd = epoll_create(1); if(epfd < 0){ perror("epoll_crreate"); return 1; } printf("before epoll_wait\n"); //一直等下去 nfds = epoll_wait(epfd, null, 1, -1); printf("after epoll_wait:%d\n", nfds); printf("%d\n", errno); perror("perror after epoll_wait"); return 0; }
执行方法:
1,执行程序
2,先用下面的命令找到当前执行程序的pid
ps -e | grep a.out
结果:
ys@ys-virtualbox:~/cpp/network$ ps -e | grep a.out 2882 pts/0 00:00:00 a.out
3,给个执行中的程序发signal
kill -s sigusr1 2882
结果:
before epoll_wait signal called after epoll_wait:-1 4 perror after epoll_wait: interrupted system call
2,使用sockpair。
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/epoll.h> #define events 8 int soc[2]; void processa(){ sleep(3); printf("processa: send message\n"); write(soc[0], "hello\n", 6); return; } void processb(){ int epfd; epoll_event ev, ev_ret[events]; int nfds; int i; char buf[128]; epfd = epoll_create(1); if(epfd < 0){ perror("epoll_create"); return ; } memset(&ev, 0, sizeof(ev)); ev.events = epollin; ev.data.fd = soc[1]; if(epoll_ctl(epfd, epoll_ctl_add, soc[1], &ev) != 0){ perror("epoll_clt"); return ; } memset(&ev, 0, sizeof(ev)); ev.events = epollin; ev.data.fd = fileno(stdin); if(epoll_ctl(epfd, epoll_ctl_add, fileno(stdin), &ev) != 0){ perror("epoll_clt1"); return ; } while(1){ printf("before epoll_wait\n"); nfds = epoll_wait(epfd, ev_ret, events , -1); if(nfds < 0){ perror("epoll_wait"); return; } printf("after epoll_wait\n"); for(i = 0; i < nfds; ++i){ if(ev_ret[i].data.fd == soc[1]){ printf("processb:break message from socketpair\n"); goto outofloop; } else if(ev_ret[i].data.fd == fileno(stdin)){ read(fileno(stdin), buf, sizeof(buf)); printf("processb:input from stdin\n"); } } } outofloop: printf("process b:outside of loop\n"); return ; } int main(){ int ret; ret = socketpair(af_unix, sock_stream, 0, soc); if(ret != 0){ perror("socketpair"); return 1; } if(fork() == 0){ processa(); } else{ processb(); } return 0; }
c/c++ 学习互助qq群:877684253
本人微信:xiaoshitou5854
上一篇: Redis 5种主要数据类型和命令
下一篇: c语言:&&和||的关系
推荐阅读
-
c/c++ linux epoll系列3 利用epoll_wait设置timeout时间长度
-
c/c++ llinux epoll系列5 解除epoll_wait状态
-
c/c++ llinux epoll系列4 利用epoll_wait实现非阻塞的connect
-
c/c++ linux epoll系列2 利用epoll_wait查看是否可以送信
-
c/c++ llinux epoll系列4 利用epoll_wait实现非阻塞的connect
-
c/c++ linux epoll系列2 利用epoll_wait查看是否可以送信
-
c/c++ linux epoll系列3 利用epoll_wait设置timeout时间长度
-
c/c++ llinux epoll系列5 解除epoll_wait状态