Recuperer PID de l'appli et ecrire dans un fichier

Résolu
Metalbobinou Messages postés 42 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 19 septembre 2012 - 26 nov. 2008 à 00:55
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 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 !

5 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
26 nov. 2008 à 14:30
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...
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
26 nov. 2008 à 14:26
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.
0
Metalbobinou Messages postés 42 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 19 septembre 2012
26 nov. 2008 à 19:26
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 !
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
27 nov. 2008 à 09:26
Un char : 8 bits = 1 byte = 1 octet.

Listes des types de données, leurs tailles et plages.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
1 déc. 2008 à 10:39
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"
0
Rejoignez-nous