2010-04-26 7 views

ответ

0

Если вы действительно программирование в ядро ​​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; 
} 
2

Да, вы можете проверить это:

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-структуру, так что реальный вопрос что вы собираетесь с этим делать?

+0

+1 для окончательного предложения. –

1

Предполагая, что вы в ядре и имеют контекст процесса в структура 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, который делает это для текущего процесса и адаптирует его для любого процесса.

Смежные вопросы