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 :

"Permission denied" durant ecriture fichier log


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut "Permission denied" durant ecriture fichier log
    Bonjour à toutes et à tous,

    Je développe actuellement une application C# dans laquelle j'exécute un programme "serveur" codé en C/C++.
    Je rencontre un problème assez étrange selon moi, dans le fichier C, j'ai créer une fonction "AddLog", qui permet entre autres d'écrire dans un fichier log.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    FILE *fichier = NULL;
    va_list ap;
    va_start(ap, log); 
    fichier = fopen("log.log","a");
    if (fichier == NULL)  
        printf("Error log: %d (%s)\n", errno, strerror(errno));
    else {  
        fprintf(fichier,":");
        vfprintf(fichier, log, ap);
        fprintf(fichier,"\n");
        va_end(ap);
        fclose(fichier);    
    }
    Jusqu'ici tout va bien l'ennui c'est qu'à partir d'un moment donné dans mon programme, les logs ne s'écrivent plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    EnterCriticalSection(&critical);
    printf("\nWaiting for a connection on TCP port %d (nbr of current threads = %d)...\n", pServer->TCPServerPort, (*pServer->lChildInfo));
    AddLog("Waiting for a connection on TCP port %d (nbr of current threads = %d)...", pServer->TCPServerPort, (*pServer->lChildInfo));
    LeaveCriticalSection(&critical);
     
    // creating variables to be passed to the thread
    struct*ThreadData = (struct*) malloc(sizeof(struct));
    ThreadData->csock = (int*)malloc(sizeof(int));
    memcpy(&ThreadData->pServer,&pServer,sizeof(pServer));
     
    if((*ThreadData->csock = accept( pServer->ListenSocket, (SOCKADDR*)&sadr, &addr_size))!= INVALID_SOCKET ){
     
        ThreadData->dwIP = sadr.sin_addr.s_addr;
        ThreadData->wPort = sadr.sin_port;
     
        printf("Received connection from %s:%d \n",inet_ntoa(sadr.sin_addr), ntohs(sadr.sin_port));
        AddLog("Received connection from %s:%d ",inet_ntoa(sadr.sin_addr), ntohs(sadr.sin_port));
    Ce que je n'explique pas c'est que tous les AddLogs précédents le AddLog("Received connection from...") s'écrivent correctement dans mon fichier log.log, et que tous ceux à partir de ce dernier, ne s'écrivent pas car "Error 13 : Permission denied". Or, je sais que mon fichier à tous les privilèges (je m'en suis assuré en le mettant sur une machine linux et en faisant un chmod 777 dessus). De plus, quand j'exécute directement l'exécutable serveur je ne rencontre pas ce problème c'est uniquement quand je lance l'exécutable à partir de mon application C# que les logs à partir du AddLog("Received connection from...") buguent.

    J'espère avoir été assez clair, n'hésitez pas à demander plus d'informations dans le cas contraire.

    Merci et bonne journée à tous

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    As-tu essayé de faire tourner le programme en root:root pour voir si l'erreur revient ?
    Ou pourrais-tu créer un /home pour le user qui fait tourner le programme, et lui dire d'écrire dedans avec des droits "classiques" pour voir si ça le fait encore.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Quand je vois cela : "ThreadData" je me dis que c'est du multi thread.

    "Error 13 : Permission denied", c'est peut être pas un problème de droit mais un problème d'accès concurrent. Le fichier est peut être déjà ouvert par un autre thread et pas encore refermé.

    Peut être qu'il faudrait mettre une section critique dans ta fonction AddLog().
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Haha, je n'ai même pas vu le ThreadData...

    Je plussoie grandement ram_000 !
    Un peu de mutex serait bien pour voir !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    Rebonjour,

    Tout d'abord merci pour vos réponses!
    En effet c'est bien un problème de conflit d'écriture apparemment.
    J'ai rajouté des sections critiques dans ma fonction mais à la place des permission denied ca plante complétement(je le rappel, je lance mon programme depuis une application GUI C#).
    Ce qui me préoccupe on va dire surtout, c'est que si j'exécute directement le programme en double cliquant dessus, sur l'exécutable, je n'ai absolument aucun problème de Permission denied et tous les logs apparaissent dans le fichier.
    Il n'y a que lorsque j'exécute le programme depuis mon GUI que j'ai des soucis à ce niveau la.

    J'ai fais un simple test d'écriture d'un des logs qui posent problème AddLog("waiting connection ...") dans un autre fichier (ca pas de soucis) puis j'ai essayé de copier ce fichier vers le fichier log.log classique et pareil je me mange un permission denied!

    Si vous avez d'autres idées honnetement je suis preneur car la je vois pas..

    Merci encore

  6. #6
    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
    Es-tu sûr que le programme C# est bon?

  7. #7
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    Le programme C# est assez simple, y a un bouton start qui lorsqu'on appuie dessus lance l'exécutable C à l'aide d'un Process.start() et ne va faire que lire et afficher les données du fichier "log.log" toutes les secondes, fichier dans lequel l'exécutable écrit jusqu'à un certain moment puis n'écrit plus car Permission denied voila tout.
    Donc je pense vraiment pas que le problème vienne du prog C#

  8. #8
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Je crois que tu n'as juste pas le droit d'écrire le fichier...

    Je te conseille d'écrire un chemin en dur vers un /var/log/mon_log...
    Précisément :
    su/sudo -s (tu prends celui que tu veux)
    cd /var/log
    touch mon_log
    chown mon_user:mon_group mon_log
    chmod 644 mon_log
    exit

    Et tu écris dans ton code en chemin de log : /var/log/mon_log
    Avec mon_user = le user qui fait tourner le serveur, mon_group = son groupe, mon_log = le nom de ton log.

    Normalement, quand on lance un daemon UNIX, il est censé créer le fichier de log (et tous les fichiers nécessaires) avant de changer d'utilisateur... et une fois devenu "un utilisateur", il écrit dedans sans avoir d'accès supplémentaires, ni que le fichier soit inscriptible par tous.

    Essaye ça, et on attend ton retour !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  9. #9
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    Bonjour,

    Merci pour la suggestion mais je suis sous windows , j'ai balayé la piste de l'interdiction d'écrire car pas assez de privilèges pour 2 raisons. La première c'est que si je fais clic droit propriétés onglet "sécurité" sur mon fichier de log bah je vois que tous les utilisateurs et groupes sont autorisés sont autorisés à écrire sur le fichier. D'autres part, si c'était effectivement un problème d'autorisation d'écritures AUCUN logs apparaitrait dans le fichier or certains (ceux d'avant celui qui plante justemment) apparaissent dans le cas ou j'exécute le prog depuis le GUI et TOUS apparaissent quand je lance l'exécutable depuis un invité de commande.
    Donc comme l'ont suggérés certains avant c'est très probablement un problème d'écriture multithread (mais la encore comment cela se fait que je n'ai ce problème que si je lance l'exécutable depuis le GUI et non depuis un invité de commandes..)

    Merci bien a tous

  10. #10
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    J'ai fais un simple test d'écriture d'un des logs qui posent problème AddLog("waiting connection ...") dans un autre fichier (ca pas de soucis) puis j'ai essayé de copier ce fichier vers le fichier log.log classique et pareil je me mange un permission denied!
    C'est ça qui me fait penser à un problème de droit...

    A tout hasard... tu as créé un "service Windows" ?
    Ou est-ce encore une simple appli à lancer à la main ? (pas d'applis oubliées dans le ctrl alt suppr aussi ? )

    EDIT : oui du coup... le problème de thread est très logique...
    EDIT2 : Et ça doit être une simple appli et pas encore un service windows...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  11. #11
    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
    ah tout hasard, ca ne viendrai pas du fait que plusieurs programmes (ou threads) essaient d'ouvrir le même fichier en écriture?

  12. #12
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    Bonjour a tous,

    Alors pour commencer effectivement c'est une appli WPF et non pas un service Windows.
    Après un dernier test assez simple j'aurais du y penser direct en fait.. j'ai trouvé d'où vient le problème.
    Ce n'est pas au niveau de mon code C qui lui marche très bien tout seul, mais au niveau de l'interface C# qui comme je vous l'ai dis, viens lire dans le fichier de log et affiche les logs sur une fenêtre.
    Pour une raison que j'ignore, une première partie des logs (tous ceux qui précèdent le fameux AddLog("waiting for connection..")) s'affichent sans poser de problème sur la fenêtre en meme temps que le prog C écrit dans le fichier. C'est à dire qu'il y a une lecture/écriture simultanée dans le fichier sans qu'il y est de problème.
    Cependant, pour ce qui est des logs qui vont suivre (c'est à dire ceux qui vont apparaitre lorsqu'un client va se connecter => multithreading) il y a un problème lorsque l'interface essaye de lire le fichier de logs et c'est ca qui créer mes erreurs.

    Donc je dois trouver un moyen pour afficher ces logs autrement car la lecture sur le fichier semble difficilement réalisable du coup.

    En tout cas merci à tous pour votre aide bonne continuation!

  13. #13
    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
    Pour uniquement lire des logs, l'ouverture d'un ifstream (ou fopen(…, "r")) peut fonctionner.

  14. #14
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    C'est sur l'interface C# que je dois les lire

  15. #15
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Les IPC Windows ne sont pas les mêmes que sur UNIX...
    Mais elles existent évidemment ! (dont les fameux "partages windows" qui offrent une certaine interface)

    IPC Windows

    Tu dois pouvoir développer quelque chose avec ça...
    En C ce sera probablement un peu plus tricky qu'en C#, mais tu dois pouvoir faire tout ce que tu veux !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  16. #16
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    plutôt que de t'embêter avec une gestion complexe de file locks, d'accès concurrents, etc, tu as pensé à utiliser une bdd sqlite comme fichier de log ?
    Une bonne partie de tes problèmes seraient implicitement résolus au détriment du rajout d'une dépendance vers sqlite. D'un autre côté ton interface C# serait peut-être plus simple à concevoir ... sans doute une solution à explorer si tu en as le temps.

  17. #17
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    Merci pour le lien je vais voir ca!

    Effectivement j'y avais pas pensé mais comme tu l'as dis c'est une question de temps je dois faire ce dev le plus vite possible y a une deadline qui approche et j'aimerais voila avoir la solution la plus rapide et la moins difficile à mettre en place. Le système de fichier de log ne vient pas de moi c'est le chef qui tient à garder une trace log sur un fichier propre donc voila faut juste que je trouve un moyen de pouvoir lire ce fichier..
    Sinon j'ai pensé à autre chose je sais pas si c'est possible, mais je me suis dis de laisser le fichier tranquille et de lire en fait la sortie du process C (car oui avant de d'écrire les logs dans un fichier on faisait des simples printf pour les afficher) et de l'afficher sur mon interface, c'est coté C# mais bon vu que c'est lié au sujet je pose la question directement ici

  18. #18
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Hmmm... tu devais pouvoir l'écrire dans un fichier avec fwrite, et utiliser une IPC pour envoyer le même message au C#...
    C'est un peu redondant, mais ça sera toujours ça...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  19. #19
    Membre actif
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    Ca marche je vais regarder

Discussions similaires

  1. [Python 2.X] [Errno 13] Permission denied copie d'un fichier
    Par nekcorp dans le forum Général Python
    Réponses: 3
    Dernier message: 24/11/2014, 14h56
  2. [BufferedWriter] Ecriture fichier de log sous AIX
    Par kij dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 21/09/2007, 15h11
  3. modifier fichier permission denied
    Par fara morgana dans le forum Langage
    Réponses: 12
    Dernier message: 14/06/2006, 14h32
  4. Réponses: 19
    Dernier message: 15/05/2006, 15h02

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