IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

chdir et pthread


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut chdir et pthread
    Hello à tous,

    J'aimerai executer "chdir" en "multipthread" le problème c'est que "chdir" lorsque qu'il actualise le "pwd", il le fait pour tout le processus et du coups ça modifie le path dans tout les "thread" en cours.

    Avez vous une solution pour modifier le "pwd" que dans le thread auquel j'ai executer la fonction "chdir" ?

    Merci,

    (EXEMPLE:

    THREAD 1 : HOME -> {chdir to includes) -> INCLUDES -> {chdir to ..} -> HOME

    THREAD 2: HOME

    THREAD 3: HOME -> {chdir to sources} -> SOURCES

    )

  2. #2
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    regarde du côté de openat. Au lieu de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chdir ("nouveau/chemin");
    fd=open ("chemin/vers/le/fichier", TES_FLAGS);
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dirfd=open ("nouveau/chemin", O_RDONLY);
    fd=openat (dirfd, "chemin/vers/le/fichier", TES_FLAGS);
    -> la man page de open/openat

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir
    Citation Envoyé par dobobaie Voir le message
    Hello à tous,

    J'aimerai executer "chdir" en "multipthread" le problème c'est que "chdir" lorsque qu'il actualise le "pwd", il le fait pour tout le processus et du coups ça modifie le path dans tout les "thread" en cours.

    Avez vous une solution pour modifier le "pwd" que dans le thread auquel j'ai executer la fonction "chdir" ?

    Merci,
    j'ai de sérieux doutes sur la solution émise (openat).
    il faut comprendre que les processus légers partagent le même espace de mémoire, mais aurons chacun leurs propres piles donc, c'est peut-être normale que leur accès ressources soit direct et qu'au final tu obtiennes ce comportement.
    Comme solution, il est préférable de protéger les accès avec des sémaphores et aussi faire attention à la synchronisation.
    La seconde option la plus adaptée serait d'écrire un seul même code pour les différents processus légers avec si possible une instance par processus ce qui traiterait (théoriquement) indépendamment les ressources et au final pourrait faire ce que tu souhaites
    à bientôt

  4. #4
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    ...
    j'ai de sérieux doutes sur la solution émise (openat).
    ...
    Pourquoi donc ? C'est, entre autre, pour cette raison que les versions at ont été rajoutées.

    man openat
    openat() and other similar system calls suffixed "at" are supported for two reasons.

    First, openat() allows an application to avoid race conditions that could occur when using open(2) to open files in directories other than the current working directory. These race conditions result from the fact that some component of the directory prefix given to open(2) could be changed in parallel with the call to open(2). Such races can be avoided by opening a file descriptor for the target directory, and then specifying that file descriptor as the dirfd argument of openat().

    Second, openat() allows the implementation of a per-thread "current working directory", via file descriptor(s) maintained by the application. (This functionality can also be obtained by tricks based on the use of /proc/self/fd/dirfd, but less efficiently.)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut
    Hello,

    merci pour vos réponse. J'avais déjà vue openat le soucis (à pars si je l'ai mal appliquée) c'est qu'il modifie pas le pwd et donc si j'execute la fonction "execve" du coups ça va resté sur le pwd de base. Et justement j'aimerai manipulé le deplacement de repertoire tout en gérant execve :/

    Sinon pour le system des sem c'est un outils interessant mais le soucis c'est que en faite j'aimerai faire un FTP multi client et donc si un client transfère des fichiers et un autre aimerai modifier le repertoire et se baladé dedans, il risque d'attendre longtemps avant l'execution de sa commande.

  6. #6
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Si tu tiens à faire ainsi et si tu es sous linux alors il ne te reste que l'option unshare. La man page indique :

    CLONE_FS
    Reverse the effect of the clone(2) CLONE_FS flag. Unshare file system attributes, so that the calling process no longer shares its root directory (chroot(2)), current directory (chdir(2)), or umask (umask(2)) attributes with any other process.
    Je ne l'ai jamais testé.

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    As-tu regardé la solution utilisée par ftpd, un daemon ftp linux assez classique?

    Après tout, l'avantage premier de l'open-source, c'est justement d'être open-source

  8. #8
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    Citation Envoyé par picodev Voir le message
    Pourquoi donc ? C'est, entre autre, pour cette raison que les versions at ont été rajoutées.
    J'ai un sérieux doute non pas sur la fonction, car comme tu le dis, elle est faite pour être utilisé avec des processus légers, mais là où j'ai un sérieux doute c'est la façon dont il sera utilisé, car les processus partagent le même répertoire courant, il est préférable d'instancier chaque processus léger de façon à ce que chaque processus est indépendamment le moyen de traiter les descripteurs de fichier sinon dans le cas contraire, cela reviendrait à faire un open et en obtiendrait le même résultat initial.

    à bientôt

Discussions similaires

  1. Pthread et semaphores
    Par Yabo dans le forum Linux
    Réponses: 9
    Dernier message: 30/03/2008, 00h09
  2. Des problemes avec ces threads <pthread.h>
    Par nasamad dans le forum GTK+ avec C & C++
    Réponses: 26
    Dernier message: 07/07/2006, 12h46
  3. pthread et mutex
    Par Nico65 dans le forum C++
    Réponses: 20
    Dernier message: 16/01/2005, 12h30
  4. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17
  5. Réponses: 4
    Dernier message: 27/08/2003, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo