Directorio de artículos
EPOLL
Hoy en día, debido
epoll
al modo de ET se pierdeconnect事件
, sin cerebro puesta al día sólo para encontrar un error en el cual, se hace constar.
Cuando solo se utiliza el modo ET de epoll, múltiples cennect
solo pueden activar uno 事件
, por lo que es necesario realizar un bucle accept
hasta que regrese -1
y error
se establezca WAGAIN
o WEOULDBLOCK
no salga del bucle. De lo contrario lo hará 丢失connect事件
.
La diferencia entre LT LT y ET
LT de Epoll : disparador horizontal, la eficiencia será menor que la del disparador ET, especialmente en el caso de gran concurrencia y gran flujo. Sin embargo, LT tiene requisitos relativamente bajos para la escritura de código y no es propenso a problemas. El rendimiento de la escritura del servicio en modo LT es: mientras haya datos que no se hayan obtenido, el núcleo continuará notificándole, por lo que no hay necesidad de preocuparse por la pérdida del evento.
ET: La activación de borde es muy eficiente. En el caso de tráfico concurrente y grande, habrá muchas menos llamadas al sistema epoll que LT, por lo que la eficiencia es alta. Sin embargo, los requisitos para la programación son altos y cada solicitud debe manejarse con cuidado, de lo contrario, puede ocurrir fácilmente un evento de pérdida.
El siguiente es un ejemplo para ilustrar la diferencia entre LT y ET (ambos son modos sin bloqueo, no se dice bloqueo, la eficiencia es demasiado baja):
en modo LT, si la llamada de aceptación regresa, puede establecer inmediatamente la conexión actual y luego esperar epoll_wait El siguiente aviso es el mismo que select.
Pero para ET, si la llamada accpet regresa, además de establecer la conexión actual, epoll_wait no puede continuar inmediatamente haciendo un loop hasta que devuelve -1, y errno == EAGAIN
- Referencia: http://www.voidcn.com/article/p-qhcylfuz-bkv.html
man 7 epoll
while(1)
{
struct sockaddr_in client_address;
socklen_t len = sizeof client_address;
int connfd = accept(listenfd, (struct sockaddr*)&client_address, &len);
if(connfd == -1)
{
if(errno == EAGAIN || errno == EWOULDBLOCK)
{
break;
}
}
else
{
addfd(epollfd, connfd, true);
}
}
Dos funciones
sendfile();
copy_file_range();
以上两个函数输入必须是可以映射到内存的文件,输出sendfile()必须是套接字,copy_file_range()没有限制。
GDB
// TODO
depura el programa multiproceso
http://logan.tw/posts/2015/11/01/debug-multithreaded-program-with-gdb/
Otros
Con respecto a switch
un pequeño problema, case
debe usar llaves para cada uno . Raramente he usado este problema antes. Puedo consultarlo aquí: https://stackoverflow.com/questions/5685471/error-jump-to-case-label