В программировании ядра Linux есть способ проверить, используется ли конкретный файловый дескриптор для данного процесса или доступен ли он?Linux Kernel - Проверьте, не принят ли дескриптор файла
ответ
Если вы действительно программирование в ядро Linux, то вы бы смотреть на files_struct
, прикрепленного к task_struct
процесса вы заинтересованы в.
Но то, что я думаю, что вы имеете в виду, что вы 'написать программу пользовательского пространства для запуска на Linux, используя API ядра. В этом случае это немного сложнее.
Существует нет прямого способа сделать это, о котором я знаю. Однако вы должны сделать небольшой взлом с fcntl
. В основном вы запрашиваете флаги состояния для файлового дескриптора, и если вы получаете сообщение об ошибке (более или менее) о том, что дескриптор файла недействителен - и, следовательно, его можно использовать.
Тем не менее, это здорово, если у вас несколько потоков. Другой поток может использовать дескриптор файла после того, как вы его проверили. Если вы действительно хотите использовать этот файловый дескриптор, возможно, вы хотите dup2()
или F_DUPFD
, но я не уверен, что вы на самом деле пытаетесь сделать.
Пример кода:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int main(void)
{
int rc, fd;
for (fd = 0; fd < 8; fd++) {
errno = 0;
rc = fcntl(fd, F_GETFL);
if (rc >= 0)
printf("fd %d is open\n", fd);
else if (errno == EBADF)
printf("fd %d is closed\n", fd);
else
printf("error %d querying fd %d \n", errno, fd);
}
return 0;
}
Да, вы можете проверить это:
struct files_struct * files = task->files;
struct fdtable *fdt;
spin_lock(&files->file_lock);
fdt = files_fdtable(files);
if (test_bit(fd, fdt->open_fds->fds_bits))
{
/* fd is in use */
}
spin_unlock(&files->file_lock);
Однако информация потенциально устарели, как только вы разблокировать files
-структуру, так что реальный вопрос что вы собираетесь с этим делать?
Предполагая, что вы в ядре и имеют контекст процесса в структура task_struct * прок, и вы хотите только проверить, что данная FD соответствует открытому файлу в этом процессе, и на самом деле не использовать файл как-то:
int is_valid_fd_for_process(int fd, struct task_struct* proc)
{
int exists;
rcu_read_lock();
exists = (NULL != fcheck_files(proc->files, fd));
rcu_read_unlock();
return exists;
}
Если вы действительно хотите использовать файловую структуру, которая так или иначе будет храниться в этом fd-адресе или сохраните ее, вы должны получить ссылку для нее. См. Код fget, который делает это для текущего процесса и адаптирует его для любого процесса.
- 1. Linux Kernel - дескриптор файла Socket close location
- 2. Linux open() дескриптор файла
- 3. Linux: проверьте, если дескриптор файла доступен для чтения
- 4. Файловый дескриптор Linux из файла
- 5. linux kernel, когда файловый дескриптор недоступен для pread?
- 6. Perl: Проверьте, если оболочка перенаправила дескриптор файла
- 7. Заблокировать вход процесса в Linux Kernel
- 8. linux kernel проверяет, продолжает ли процесс
- 9. Является ли Linux kernel splice() нулевой копией?
- 10. Процесс в Linux Kernel space
- 11. linux kernel debug log
- 12. Дескриптор файла не генерируется
- 13. Linux Kernel Threads - планировщик
- 14. Встраиваемые Linux Kernel и Desktop Linux Kernel Difference
- 15. glib и linux kernel
- 16. Изменить адрес I2C Linux kernel kernel
- 17. Текстовые символы Linux Kernel
- 18. Android Linux Kernel Подробнее
- 19. linux kernel ota framework?
- 20. Отладка Linux Kernel
- 21. Patching Linux Kernel
- 22. linux kernel process bookkeeping
- 23. Gnu Debugger & Linux Kernel
- 24. Preemption in Linux Kernel
- 25. Проверить, имеются ли исправления в linux-kernel
- 26. Linux Kernel Generic Netlink - Параллельно ли это?
- 27. linux kernel + условные операторы
- 28. linux kernel I/O
- 29. проверить, работает ли Linux Kernel Module
- 30. Дескриптор сокета Linux
+1 для окончательного предложения. –