c - epoll_wait和dup2跨fork交互
问题描述
情况是我有一个 shell 和一个基于 X 的交互式应用程序,它通过标准输入的套接字接收命令dup2
。代码如下
// shell init
int sockfds[2] = { -1, -1 };
socketpair(AF_UNIX, SOCK_STREAM, 0, 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, EPOLL_CTL_ADD, 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 显示在子进程中。我遇到了 epoll 的极端情况吗?
解决方案
推荐阅读
- python - pip install failed with SSL certificate verify failed (_ssl.c:833)
- java - JAXB Wrapper+Adapter 忽略输出
- flutter - 如何在 Flutter 中偏移脚手架小部件?
- javascript - (Node.js & React.js) 登录成功后如何移除/显示不同的按钮?
- android - 我想在通话过程中找到安卓手机的扬声器状态
- ios - “您的应用缺少对以下 URL 方案的支持:com .googleusercontent.apps.xxx”
- elixir - 如何使用 Ecto / Elixir 在子查询中选择虚拟属性
- python - Setuptools:如何确保 pip 删除打包代码生成的文件
- c# - 最近的 Windows 更新后 EmguCV 无法正常工作
- javascript - 将 AngularJS 表单提交到链接的 Mongoose 模型