如何解决epoll_wait和dup2之间通过fork的交互
这种情况是,我有一个外壳和一个基于X的交互式应用程序,该应用程序通过基于stdin的套接字dup2
接收命令。代码如下
// shell init
int sockfds[2] = { -1,-1 };
socketpair(AF_UNIX,SOCK_STREAM,sockfds);
int epfd = epoll_create1(EPOLL_CLOEXEC);
struct epoll_event events[1];
events[0].events = EPOLLIN;
events[0].data.fd = sockfds[0];
epoll_ctl(epfd,EPOLL_CTL_ADD,&events[0]);
// shell child
dup2(sockfds[1],STDIN_FILENO);
dup2(sockfds[1],STDOUT_FILENO);
dup2(sockfds[1],STDERR_FILENO);
close(sockfds[0]);
close(sockfds[1]);
// shell parent
// continues loop and blocks on readline(3) and parses the returned string; send a message unconditionally
char msg[] = "hello,world\n";
write(sockfds[0],msg,sizeof msg);
// X application
int epollfd = epoll_create1(0);
struct epoll_event stdin_event,ev;
stdin_event.events = EPOLLIN;
stdin_event.data.fd = STDIN_FILENO;
epoll_ctl(epollfd,STDIN_FILENO,&stdin_event);
while(is_running) {
int is_command_pending = epoll_wait(epollfd,&ev,1,0);
if(is_command_pending > 0) {
is_running = 0;
}
}
尽管我在shell进程中发送了一条消息,但是在epoll的子进程中没有消息出现。我遇到过紧急情况吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。