Metalbobinou
Messages postés42Date d'inscriptionmardi 17 avril 2007StatutMembreDernière intervention19 septembre 2012
-
26 nov. 2008 à 00:55
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 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 :
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 ^^'
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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...
Metalbobinou
Messages postés42Date d'inscriptionmardi 17 avril 2007StatutMembreDernière intervention19 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)...
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"