Al igual que el título dice, registro un descriptor de archivo que es un directorio con epoll, ¿qué hace?¿Qué hace epoll con un descriptor de archivo que hace referencia a un directorio?
Respuesta
Nada - la llamada para registrar el archivo fd (al menos para los sistemas de archivos Linux comunes) falla con EPERM
.
He probado esto con el siguiente programa de demostración:
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void) {
int ep = epoll_create1(0);
int fd = open("/tmp", O_RDONLY|O_DIRECTORY);
struct epoll_event evt = {
.events = EPOLLIN
};
if (ep < 0 || fd < 0) {
printf("Error opening fds.\n");
return -1;
}
if (epoll_ctl(ep, EPOLL_CTL_ADD, fd, &evt) < 0) {
perror("epoll_ctl");
return -1;
}
return 0;
}
con el siguiente resultado:
[[email protected]:/tmp]$ make epoll
cc epoll.c -o epoll
[[email protected]:/tmp]$ ./epoll
epoll_ctl: Operation not permitted
Para averiguar lo que estaba pasando aquí, fui a la fuente. I happen to know que la mayoría del comportamiento de epoll
está determinado por la función ->poll
en el struct file_operations
correspondiente al archivo de destino, que depende del sistema de archivos en cuestión. Cogí ext4
como un ejemplo típico, y miré fs/ext4/dir.c
, que definesext4_dir_operations
de la siguiente manera:
const struct file_operations ext4_dir_operations = {
.llseek = ext4_dir_llseek,
.read = generic_read_dir,
.readdir = ext4_readdir,
.unlocked_ioctl = ext4_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = ext4_compat_ioctl,
#endif
.fsync = ext4_sync_file,
.release = ext4_release_dir,
};
nota la falta de una definición .poll
, lo que significa que será inicializado a NULL
. Así, haciendo pivotar de nuevo a epoll, que se define en fs/eventpoll.c
, buscamos cheques por poll
ser NULL, y nos encontramos con uno early on en la definición epoll_ctl
syscall:
/* The target file descriptor must support poll */
error = -EPERM;
if (!tfile->f_op || !tfile->f_op->poll)
goto error_tgt_fput;
Como se indica nuestra prueba, si el archivo de destino doesn no es compatible con poll
, el intento de inserción simplemente fallará con EPERM
.
Es posible que otros sistemas de archivos definan .poll
métodos en sus objetos de archivos de directorio, pero dudo que muchos lo hagan.
Es 'dirfd (opendir ("/tmp "))' preferido sobre 'abierto (ruta, O_RDONLY | O_DIRECTORY);'? Solo una pregunta de estilo. Usar 'opendir' no hace mágicamente que la encuesta de soporte fs. – schmichael
'dirfd (opendir (" ... "))' es más portátil, por lo que probablemente se prefiera en general. Soy un pirata informático del kernel de Linux, por lo que, en general, prefiero utilizar la interfaz de llamada al sistema incluso cuando no es la más adecuada, porque lo sé mejor. Obviamente, aquí no importa, ya que 'epoll' también es específico de Linux. – nelhage
- 1. guión fsx que hace referencia a un dll que hace referencia a muchos dll
- 2. ¿Qué hace que seleccione (2) si cierra (2) un descriptor de archivo en un hilo separado?
- 3. Ruby: agregando un directorio a $ LOAD_PATH - ¿qué hace?
- 4. Hace referencia a un archivo .class en IntelliJ Java Project
- 5. Powershell: hace referencia a una propiedad que contiene un espacio
- 6. Hace referencia a un archivo css ubicado en el área
- 7. ¿Qué hace que svn commit falle e informe un archivo/directorio como obstruido?
- 8. ¿Qué hace un IISReset?
- 9. ¿Por qué hace esto lo que hace?
- 10. Qué sucede con app.config en un proyecto al que se hace referencia
- 11. ¿Cómo se hace referencia a un stub que tiene un parámetro genérico de sí mismo que utiliza Microsoft Fakes?
- 12. ¿Qué hace un símbolo de porcentaje en un archivo MAKE?
- 13. ¿Qué hace que un lenguaje sea orientado a objetos?
- 14. ¿Qué es un archivo IOR, qué hace y cómo funciona?
- 15. Adición de frascos que se hace referencia a Android build.xml
- 16. ¿Qué hace esta línea perl de un archivo "blanqueado"?
- 17. ¿Qué hace que este archivo de encabezado sea lento VS2005 a un rastreo? (¿IntelliSense exonerado?)
- 18. Hace referencia a MSBuildTasks del paquete Nuget
- 19. creación de un modelo que hace referencia a sí mismo con Google App Engine
- 20. ¿Qué hace un vago val?
- 21. ¿Qué hace el archivo .csproj?
- 22. Hace referencia a la función de constructor
- 23. Hace referencia al ensamblado actual con CompilerParameters
- 24. ¿Qué hace Django con `MEDIA_ROOT`?
- 25. ¿Cómo se hace referencia a un objeto en Lua?
- 26. Django: ¿qué hace "cargar" (en un archivo de plantilla)?
- 27. ¿Cómo se crea un archivo temporal con cacao? Hace
- 28. Eclipse: Hace referencia a log4j.dtd en log4j.xml
- 29. ¿Cómo saber a qué clase se hace referencia más?
- 30. LaTeX: Cite, pero no hace referencia a
Si desea supervisar los eventos del sistema de archivos en Linux, use ['inotify'] (http://linux.die.net/man/7/inotify). – jxh