2010-04-26 14 views

Répondre

0

Si vous programmez vraiment dans le noyau Linux alors vous regardez le files_struct attaché au task_struct du processus qui vous intéresse.

Mais ce que je pense que vous voulez dire que vous Écrit un programme d'espace utilisateur pour exécuter sur Linux, en utilisant l'API du noyau. Dans ce cas, c'est un peu plus difficile.

Il n'y a pas de façon directe de le faire à ma connaissance. Cependant, vous devriez être en mesure de faire un petit hack avec fcntl. Fondamentalement, vous interrogez les indicateurs d'état pour le descripteur de fichier, et si vous obtenez une erreur, vous savez (plus ou moins) que le descripteur de fichier n'est pas valide - et donc utilisable.

Cependant, il est racé si vous avez plusieurs threads. Un autre thread pourrait utiliser le descripteur de fichier après l'avoir vérifié. Si vous voulez vraiment utiliser ce descripteur de fichier, vous voulez peut-être dup2() ou F_DUPFD, mais je ne suis pas sûr de ce que vous essayez réellement de faire.

code Exemple:

#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

Oui, vous pouvez tester ceci:

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); 

Cependant, l'information est potentiellement à jour dès que vous déverrouillez le struct files, donc la vraie question est ce que tu vas faire avec?

+0

+1 pour la dernière phrase. –

1

En supposant que vous êtes dans le noyau et un contexte de processus dans struct task_struct * proc et que vous voulez vérifier que la fd donnée correspond à un fichier ouvert dans ce processus et utilise pas réellement le fichier en quelque sorte:

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; 
} 

Si vous voulez réellement utiliser la structure de fichier que cette fd adresse en quelque sorte ou stocker pour plus tard, vous devriez acquérir une référence pour cela. Voir le code de fget qui fait cela pour le processus en cours et l'adapter à tout processus.

Questions connexes