首页 > 解决方案 > 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 的极端情况吗?

标签: clinuxforkepolldup2

解决方案


推荐阅读