以下是client的程序,在关机重启之后client出现重复输出stdin字符的问题,是什么原因
static void *fcwli_epollRW(void * arg)
{
int slave_sock = (int)(long) arg; /* 注意不同系统中的区别 */
char serial;
int readLen;
char buffer[1024*100];
int i;
int nfds;
int unit = 0;
// epoll
int epoll_fd = epoll_create1(0);
if (epoll_fd < 0) {
DBG_ZSZ("epoll_create1");
close(slave_sock);
cli__stopUseFakeConsole();
return NULL;
}
master_info.epoll_fd = epoll_fd;
/* 传输unit 号 */
unit = UNIT_CURRENT;
if(write(slave_sock,(char*)&unit,sizeof(unit)) < 0)
{
DBG_ZSZ("write unitId error");
goto done;
}
struct epoll_event ev, events[2];
// 添加标准输入监控
ev.events = EPOLLIN;
ev.data.fd = STDIN_FILENO;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) < 0) {
DBG_ZSZ("epoll_ctl stdin");
goto done;
}
// 添加套接字监控(包含断开检测)
ev.events = EPOLLIN | EPOLLRDHUP; /* 监控套接字 EPOLLIN | EPOLLRDHUP 状态*/
ev.data.fd = slave_sock;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, slave_sock, &ev) < 0) {
DBG_ZSZ("epoll_ctl sock");
goto done;
}
DBG_ALZ("epoll loop start");
DBG_ZSZ("fwcli__useMasterCliServer------sockfd:%d",slave_sock);
// 主事件循环
while (1)
{
nfds = epoll_wait(epoll_fd, events, 2, 100); // 100ms 超时
// 检查退出标志
pal_mutex_take(mtx_fakeConsole, pal_mutex_FOREVER);
if(FALSE == bUseFakeConsole) /* 每次循环都检查bUseFakeConsol的值,如果为False那么线程结束,tFakeConsole结束*/
{
printf("FALSE\n");
pal_mutex_give(mtx_fakeConsole);/* 停止使用fakeConsole*/
break; /* 立即结束监听 */
}
pal_mutex_give(mtx_fakeConsole);
if (nfds < 0) {
DBG_ALZ("epoll_wait eroor");
break;
}
for (i = 0; i < nfds; i++)
{
if ( STDIN_FILENO == events[i].data.fd) {
/* 处理标准输入 */
if (read(STDIN_FILENO, &serial, 1) < 0)
{
DBG_ALZ("stdin read error");
goto done;
}
DBG_ZSZ_FILE("/tmp/input.txt","input: %c",serial);
pal_mutex_take(mtx_slaveSendInput, pal_mutex_FOREVER);
if (write(slave_sock, &serial, 1) < 0) {
pal_mutex_give(mtx_slaveSendInput);
goto done;
}
pal_mutex_give(mtx_slaveSendInput);
}
else if (slave_sock == events[i].data.fd)
{
/* 处理服务器关闭 */
if (events[i].events & EPOLLRDHUP)
{
DBG_ALZ("Master closed connection");
goto done;
}
/* 处理服务器数据 */
readLen = read(slave_sock, buffer, sizeof(buffer));
if (readLen <= 0)
{
if (readLen < 0) DBG_ALZ("read 失败");
goto done;
}
write(STDOUT_FILENO, buffer, readLen);
}
}
}
done:
DBG_ALZ("epoll loop end");
DBG_ZSZ_FILE("/tmp/close.txt","close(epoll_fd) %d",epoll_fd);
DBG_ZSZ_FILE("/tmp/close.txt","close(slave_sock) %d",slave_sock);
cli__stopUseFakeConsole();
close(epoll_fd);
close(slave_sock);
return NULL;
}
最新发布