Recuperer PID de l'appli et ecrire dans un fichier [Résolu]

Metalbobinou 42 Messages postés mardi 17 avril 2007Date d'inscription 19 septembre 2012 Dernière intervention - 26 nov. 2008 à 00:55 - Dernière réponse : sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention
- 1 déc. 2008 à 10:39
Bonsoir,
Alors voila, vu que j'ai du mal en C, et que cela va etre necessaire que j'en fasse pour mes etudes, j'ai decide de m'y mettre.
J'ai voulu faire simple pour le moment : recuperer le PID de mon executable et l'ecrire dans un fichier, tout en verifiant que le fichier n'est pas deja existant (en fait c'est pour essayer un pitit Daemon.... qui recuperera des signaux et s'arretera, ou pas.... tout en l'empechant de demarrer plsuieurs fois).

Donc pour ca, j'ai fais un pitit bout de code tout bebete :

-------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>



int
write_in_file()
{
  int fd;
  pid_t pid;


  fd=open("/tmp/pid-de-mon-daemon.pid", O_CREAT | O_WRONLY | O_EXCL, 0666);
  if (fd < 0)
    {
      write(STDERR_FILENO,
     "Une instance du Daemon est deja en cours\n",
     47);
      close(fd);
      return(2);
    }
  else
    {
      pid=getpid();
      printf("%u",pid);
      write(fd,&pid,5);
      close(fd);
      return(0);
    }
}



int
main ()
{
  int i;


  i=write_in_file();
  if ( i == 0 )
    {
      return(0);
    }
  else
    {
      return(2);
    }
}

----------------------

Mon "vrai" probleme, c'est qu'au printf, je ne vois que les 4 premiers nombre de mon PID alors qu'il en fait 5.... (<= a prendre avec des pincettes :P)
Bon enfin, ca, c'est un des 2 problemes, l'autre, c'est que dans mon fichier, j'ai des caracteres "bizarres".

Je suppose que pour le 2e probleme, c'est a cause du type... certes c'est un nombre, mais les 'pid_t' ne doivent pas utiliser les memes "tailles cases" que les integer ou les strings.

Si je dis qu'il ne m'affiche que les 4 premiers nombres sur 5, c'est qu'en faisant d'autres fonctions avec pleins de printf de modulos etc...
J'ai vu des nombres plus grands ! Ca m'etonne quand meme... (par exemple le printf presnete la haut affiche 8406, un autre dans mes bidouilles 84062 et un modulo me donne 2....)

Ca se trouve je n'ai qu'un seul probleme : transtypage depuis pid_t vers un char*...

Si quelqu'un pouvait m'eclairer, ca serait gentil :)
Merci d'avance....

PS : J'ai pense a "itoa", malheureusement elle n'est pas dispo sur mon systeme ^^'

Metalbobinou !
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 26 nov. 2008 à 14:30
3
Merci
Je complète...

Les deux .h les plus suceptibles de contenir pid_t :

#include <sys/types.h>
#include

write(fd,&pid,5);

Ca écrit 5 octets situés à l'adresse de pid. Ca marcherait pour une chaîne, mais là, ça écrit pid en binaire. Et ce n'est surtout pas parce que pid est un nombre à 5 chiffres qu'il est représenté par 5 octets ! Informe toi sur la représentation des nombres en mémoire...

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 26 nov. 2008 à 14:26
0
Merci
Salut,

(Réponse en ultra speed)

Tu dois avoir pid_t défini dans un des .h de ton système.
typedef ???????? pid_t.

Tu peux aussi essayer d'afficher un sizeof(pid) -> ça devrait te faire 4.

Essaie avec un %d et un %i à la place de ton %u aussi.

write(fd,&pid,5);

Ca, ça ne veut absolument rien dire.
Commenter la réponse de cs_rt15
Metalbobinou 42 Messages postés mardi 17 avril 2007Date d'inscription 19 septembre 2012 Dernière intervention - 26 nov. 2008 à 19:26
0
Merci
Merci beaucoup de la reponse ! ^^
Alors justement, je savais pas du tout sur combien de bits le PID etait represente, j'ai pris 8 au pif (alors que c'etait LOIN de pouvoir 65535 :P)...

Mais j'ai trouve ma reponse a l'ecole, un pote m'a conseille :

pid_t pid;
int i;

pid = getpid();
i = (int)pid;

Et ca marche ! :D
i contient bien le PID en chiffres, et non pas en code ASCII (ou autre :P) !
Probleme resolu ! Et promis, je vais chercher la representation en memoire...
J'avais seulement la taille d'un char en tete (4 bits je crois)...

Metalbobinou !
Commenter la réponse de Metalbobinou
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 27 nov. 2008 à 09:26
0
Merci
Un char : 8 bits = 1 byte = 1 octet.

Listes des types de données, leurs tailles et plages.
Commenter la réponse de cs_rt15
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 1 déc. 2008 à 10:39
0
Merci
puis de toute maniere ca:
      write(fd,&pid,5);

ca marcheras pas

eventuellement:

char buffer[10];

snprintf(buffer, sizebuffer, "%u", pid);
write(fd, buffer, strlen(buffer) * sizeof(*buffer));

et ton caste je vois pas a quoi il sert ... entre avoir un int et un unsigned int ca reviens du meme au meme
puis si jamais par hasard ton pid rentre pas dans un int ca marcheras pas (ok ya peu de chance)

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Commenter la réponse de sheorogath

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.