Mon application va envoyer énormément de données sur le réseau, j'ai donc décidé (parce que j'utilise Linux) d'utiliser epoll et splice. Voici comment je vois (pseudo-code):Question sur epoll et splice
epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
while(1)
{
epoll_wait (tmp_structure);
if (tmp_structure->fd == file_descriptor)
{
epoll_ctl (file_fd, EPOLL_CTL_DEL);
epoll_ctl (tcp_socket_fd, EPOLL_CTL_ADD); // wait for EPOLLOUT event
}
if (tmp_structure->fd == tcp_socket_descriptor)
{
splice (file_fd, tcp_socket_fd);
epoll_ctl (tcp_socket_fd, EPOLL_CTL_DEL);
epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
}
}
Je suppose que ma demande va ouvrir jusqu'à 2000 sockets TCP. Je veux vous poser deux questions:
- Il y aura beaucoup d'appels epoll_ctl, ne sera pas lent quand je vais avoir autant de sockets?
- Le descripteur de fichier doit d'abord être lisible et il y aura un certain intervalle avant que le socket devienne accessible en écriture. Puis-je être sûr que, au moment où le socket devient accessible en écriture, le descripteur de fichier est toujours lisible (pour éviter de bloquer l'appel)?
Par 'file_descriptor' je veux dire descripteur de fichier disque ouvert avec open() syscall, de manière à voir mon idée cloud fonctionner correctement :) – Goofy
@Goofy, vous ne pouvez pas utiliser select/epoll avec des disques dans le fichier car ils signalerait toujours lisibilité/écriture même si l'opération peut bloquer pour amener des données du disque. Voir http://www.kegel.com/c10k.html – Artyom