Я бы хотел, чтобы aio сообщал своей программе, когда операция чтения завершается, и согласно этой странице такое уведомление может быть получено либо по сигналу, отправленному ядром, либо путем запуска потока, выполняющегопользовательская функция.Любое поведение можно выбрать, установив правильное значение sigev_notify
.
. Я попробовал и вскоре обнаружил, что, даже если настроено получение уведомления по сигналу, был создан другой поток.
(gdb) info threads
Id Target Id Frame
2 Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in gettimeofday () from /lib64/libc.so.6
* 1 Thread 0x7ffff7fc3720 (LWP 6344) "xnotify" 0x0000000000401834 in update (this=0x7fffffffdc00)
В документе также указано, что: Реализация этих функций может быть выполнена с использованием поддержки в ядре (если доступно) или с использованием реализации, основанной на потоках на уровне пользователя.Хотелось бы, чтобы у меня не было потока, это возможно?
Я проверил свое ядро, и это выглядит нормально:
qdii@localhost /home/qdii $ grep -i aio /usr/src/linux/.config
CONFIG_AIO=y
Можно ли запустить aio безкакой-либо (пользовательский) поток вообще (кроме основного, конечно)?
РЕДАКТИРОВАТЬ : я копался глубже в этом.librt, кажется, предоставляет набор функций aio: просмотр источников glibc выявил что-то подозрительное: внутри /rt/aio_read.c есть заглушка функции:
int aio_read (struct aiocb *aiocbp)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (aio_read)
Я нашел первую соответствующую реализацию в подкаталоге sysdeps./ pthread, который напрямую называется __aio_enqueue_request(..., LIO_READ)
, который в свою очередь создает pthreads.Но так как мне было интересно, почему в этом случае возникнет глупость, я подумал, что, может быть, заглушка может быть реализована самим ядром Linux, и эта реализация pthread будет своего рода резервным кодом.
Grepping aio_read
через мой каталог / usr / src / linux выдает много результатов, которые я сейчас пытаюсь понять.