Petits problemes en C ( unix)

Résolu/Fermé
aveuglemspas_sourd Messages postés 286 Date d'inscription mercredi 23 mai 2007 Statut Membre Dernière intervention 12 octobre 2009 - 2 janv. 2009 à 21:38
HACKER 712 Messages postés 1282 Date d'inscription lundi 15 décembre 2008 Statut Contributeur Dernière intervention 10 décembre 2009 - 29 janv. 2009 à 18:30
Bonjour,

Voila si je fais :

int *p;
wait(p);

ça ne fonctionne pas, il faudrait que je fasse
wait(&p);

Seulement je ne suis pas sur de bien avoir saisi pourquoi.. si une âme généreuse passe dans le coin :)

10 réponses

aveuglemspas_sourd Messages postés 286 Date d'inscription mercredi 23 mai 2007 Statut Membre Dernière intervention 12 octobre 2009 20
3 janv. 2009 à 12:19
heu c'est mon prof qui m'a dit que c'était faux.. et que je devais faire wait(&p) ..
1
HACKER 712 Messages postés 1282 Date d'inscription lundi 15 décembre 2008 Statut Contributeur Dernière intervention 10 décembre 2009 255
4 janv. 2009 à 12:42
Bonjour !

j'ai une question a vous poser :

( deux en fait ! )


a quoi servent très exactement les fonctions
-malloc ()
-wait ()


prototypes et explications .......

merci a tous !
1
La fonction malloc sert à allouer de l'espace.
Exemple: créer un tableau d'entier de taille 5:
int main(){
int *tableau = malloc(5*sizeof(int));
tableau[0]=12; tableau[1]=7; tableau[2]=3; tableau[3]=19;
printf("affichage de la case 3 : %d et de la case 5 : %d\n", tableau[2], tableau[4]);
return 1;
}

La fonction calloc sert à allouer de l'espace et à effacer chacune des cases:
Exemple: créer un tableau d'entier de taille 5:
int main(){
int *tableau = calloc(5, sizeof(int));
tableau[0]=12; tableau[1]=7; tableau[2]=3; tableau[3]=19;
printf("affichage de la case 3 : %d et de la case 5 : %d\n", tableau[2], tableau[4]);
return 1;
}

La fonction wait sert à attendre la fin d'un processus fils
Exemple: attendre la fin du premier processus fils fini. (fork() sur UNIX)
int main(){
int i;
if(fork()){
printf("processus père");
i=wait(NULL);
printf("Fin du fils de PID : %d\n" i);
printf("PID père : %d\n", getpid());
}
else{
for(i=0;i<5;i++)
sleep(1);
printf("PID fils : %d \n", getpid());
exit(1);
}
return 1;
}
Cette fonction n'est utile qu'avec les processus.

Pour mettre en pause un processus pendant int x secondes, il faut utiliser la fonction sleep(x);
Exemple: mettre en pause son programme pendant deux secondes:
int main(){
printf("debut");
sleep(2);
printf("2 secondes plus tard");
return 1;
}


Normalement, tout cela devrait marcher. Attention aux fork bombs !
1
HACKER 712 Messages postés 1282 Date d'inscription lundi 15 décembre 2008 Statut Contributeur Dernière intervention 10 décembre 2009 255
29 janv. 2009 à 18:30
merci de cette longue réponse :) !
c'ets sympa !

ah oui, quand meme : ca veut dire quoi "fork bombs"


(non je ne suis pas con, ni lourd...)


et aussi, saurais tu ou apprendre le langage C ( partout sauf sur le site du zero ) ! STP !
1

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

Posez votre question
int *p;
wait(p);
C'est correct, il n'y a pas à faire:
wait(&p);
on peut même écrire
wait(NULL);
si l'on est pas intéressé par le code retour.
Mais dans tous les cas cela doit fonctionner.

Nota: La fonction wait n'attend pas un certain temps (pour cela il faut utiliser la fonction sleep); la fonction attend la terminaison d'un processus fils; s'il n' y a pas de fils la fonction echoue et reviens immédiatement.
0
HACKER 712 Messages postés 1282 Date d'inscription lundi 15 décembre 2008 Statut Contributeur Dernière intervention 10 décembre 2009 255
3 janv. 2009 à 13:01
salut !

tout simplement car le int *p
crée un pointeur !

si tu affiche p
ca te donne l'adresse de de la valeur du pointeur
&p indique la valer en elle meme !



en fin, je crois.......................
0
aveuglemspas_sourd Messages postés 286 Date d'inscription mercredi 23 mai 2007 Statut Membre Dernière intervention 12 octobre 2009 20
3 janv. 2009 à 13:27
ah j'aimerai bien que ça soit ça car ça me parle ce que tu vien de dire :)
0
HACKER 712 Messages postés 1282 Date d'inscription lundi 15 décembre 2008 Statut Contributeur Dernière intervention 10 décembre 2009 255
3 janv. 2009 à 13:28
eh bien alors je ne me suis pas trompé !
0
Que les choses soient claires.
Le prototype de la fonction wait est le suivant:
pid_t wait (int* status)
donc pour utiliser cette fonction il faut :
int status;
wait (&status);
ou
int* status = malloc (sizeof(int));
wait (status);
Au choix c'est une question de goût!
0
aveuglemspas_sourd Messages postés 286 Date d'inscription mercredi 23 mai 2007 Statut Membre Dernière intervention 12 octobre 2009 20
3 janv. 2009 à 17:37
Daccord mais peut tu m'expliquer pourquoi (concretement)
ça c'est bon

int status;
wait (&status);

et pas

int status;
wait (status);

juste pour que je comprenne

Apres malloc j'en ai entendu parler mais pas encore vu..
0
Passage de paramètres par valeur ou par référence... ça te dit quelque chose ?
Si on passe un paramètre par valeur, c'est à dire si on donne la valeur d'un paramètre à une fonction, la fonction reçoit en fait une copie du paramètre et si elle modifie cette valeur l'appelant n'en sera pas informé.
Par contre si on passe un paramètre par référence, la fonction reçoit l'adresse du paramètre et si elle modifie ce paramètre, l'appelant en sera donc informé.
C'est la raison pour laquelle la fonction 'wait' attend un pointeur afin de pouvoir retourner une information (en l'occurence la raison de la mort du fils) à l'appelant. Ceci est obligatoire car 'wait' retourne déjà une information (en l'occurence le PID du fils).
Lorsqu'on a plus d'une information à retourner, il est indispensable de passer des paramètres par référence.
0