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 (将#修改为@)