Dans la programmation du noyau linux, existe-t-il un moyen de vérifier si un descripteur de fichier particulier est utilisé pour un processus donné ou s'il est disponible?Noyau Linux - Vérifier si un descripteur de fichier est pris
Répondre
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;
}
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?
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.
- 1. Comment savoir si un descripteur de fichier est une socket?
- 2. linux + vérifier si le fichier est texte ou binaire
- 3. façon mutualisées de vérifier si un fichier est un répertoire
- 4. Comment vérifier si un fichier est ouvert
- 5. Est-il possible de vérifier si un binaire statique est compatible avec un noyau?
- 6. descripteur de fichier d'interrogation
- 7. Supprimer un noyau sous Linux?
- 8. Déterminer si un descripteur de fichier lisible est l'extrémité de lecture d'un canal
- 9. Comment vérifier si le fichier téléchargé est un fichier binaire?
- 10. Comment déterminer si un format vidéo est pris en charge
- 11. Comment vérifier si un objet est une instance de 'fichier'?
- 12. Comment vérifier si un élément HTML est pris en charge par un navigateur
- 13. descripteur de processus dans les modules du noyau
- 14. Vérifier si un flux est un fichier zip
- 15. Comment vérifier si un dossier ou un fichier est masqué =
- 16. Comment vérifier si un fichier existe dans un fichier makefile
- 17. comment vérifier si le fichier est php?
- 18. Comment vérifier si le fichier est binaire?
- 19. Noyau Linux Stable Minimum
- 20. Vérifier si le fichier est signé
- 21. L'ajout à un descripteur de fichier global est-il mauvais?
- 22. développement du noyau linux
- 23. Noyau Linux - Rafraîchissement du cache Denison VFS
- 24. Est-ce que posix aio dans linux 2.6 support descripteur de fichier socket?
- 25. WaitForSingleObject sur un descripteur de fichier?
- 26. Comment vérifier si un fichier est déjà ouvert en COBOL?
- 27. Comment vérifier si un fichier Windows est lisible/inscriptible?
- 28. Vérifier si un fichier Lilypond (.ly) est valide avec python
- 29. comment vérifier si un fichier est sélectionné avec javascript?
- 30. lot à vérifier si un seul fichier est modifié
+1 pour la dernière phrase. –