Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/01/2018, à 20:12

Baldriel

[résolut] fonction fork() et upstart

Bonjour à tous,

je débute avec Ubuntu et la programmation. Après quelques lectures en ligne, j'ai découvert la fonction fork() et j'ai essayé quelques lignes de commandes pour bien visualiser son effet. J'ai écris quelques lignes "classiques" de débutant. Mais quand j'ai écrit ceci:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
	fork() || (fork() && fork());
	pid_t pid=getpid();
	pid_t ppid=getppid();
	printf("moi, pid:%i, papa:%i\n",pid,ppid);
}

j'ai remarqué 4 processus mais aussi que le terminal était était le parent d'un processus (tout est normal jusque là)qui lui même était parent d'un processus lui-même parent d'un dernier processus. Puis le dernier processus étant enfant du processus (dans mon terminal) 1383 (qui après des recherche s'avère être /sbin/upstart). Ma situation vous a peut-être l'air simplette mais je suis perdu sur deux points:

-comment le code est interprété pour obtenir ces processus.
-pourquoi l'un de ces processus est rattaché à  /sbin/upstart.

J'ai effectué plusieurs recherches sur l'internet et sur ce forum sans trouver un sujet répondant à mes questions (peut être que j ai eu la réponse à un moment donné mais je n'ai pas dû comprendre le comprendre).

Je vous remercie d'avance pour avoir lu et prit le temps de lire ce message. Si mon sujet a déjà été traité et que vous pouvez m'y renvoyer, je vous serais gréé de le faire et je m'excuse d'avoir créé un post pour rien.

Baldriel.

Dernière modification par Baldriel (Le 05/02/2018, à 20:57)

Hors ligne

#2 Le 24/01/2018, à 20:37

le.iota

Re : [résolut] fonction fork() et upstart

Ce qui se passe est que le processus dont est issu le «fils» du fork a terminé, aussi le fils se trouve alors rattaché normalement sauf erreur de ma part au processus 1 qui est toujours init quelque soit la configuration (du moins c'était ainsi avant SystemD). Le processus upstart «remplace» peut-être init avec SystemD. Un petit «man upstart» devrait t'en dire plus.

Hors ligne

#3 Le 24/01/2018, à 20:44

Baldriel

Re : [résolut] fonction fork() et upstart

merci le.iota, en effet upstart est rattaché à init. Je tiens à te remercié pour la rapidité avec laquelle tu as répondu.
mais je n'arrive pas identifier quel processus se retrouve rattaché à upstart. Si tu avais une piste à me donner je te serait reconnaissant.

Hors ligne

#4 Le 24/01/2018, à 21:15

le.iota

Re : [résolut] fonction fork() et upstart

le.iota a écrit :

Le processus upstart «remplace» peut-être init avec SystemD. Un petit «man upstart» devrait t'en dire plus.

Jusqu'à plus informé ce n'est pas ça, je n'ai pas upstart sur mon système. Ce qui se passe que je ne t'ai pas dit (mais que tu devrais trouvé plus détaillé dans un cours de système :

le ork crée deux processus identiques, l'un le père reçoit comme retour de la fonction fork() le pid du fils, l'autre, le fils reçoit 0.

Quand tu fais fork()||(fork && fork) :

Considérons le premier fork : le père reçoit une valeur non nulle (donc true) et n'exécute donc pas ce qui se situe après le II (c'est un OU). Le deuxième fork() est exécuté par le fils qui crée donc un petit-fils et comme il reçoit une valeur non nulle, c'est considéré comme true et donc il (le fils) exécute ce qu'il y a après le && (c'est un ET), le 3ème fork, le premier petit-fils n'exécute pas le 3ème fork, seul le fils l'exécute.

Ce qui se passe ensuite, c'est que tu fais des entrées-sorties concurrentes, puis le processus se termine. S'il se termine avant que son fils fasse son impression, celui-ci est orphelin (ppid=1 et chez toi va savoir pourquoi pid(upstart)
Dès que j'ai vu à quoi srt upstart, je t'en dis plus.

Hors ligne

#5 Le 24/01/2018, à 21:26

Baldriel

Re : [résolut] fonction fork() et upstart

Encore merci du coup, je comprenais ce que retournait fork() mais je ne voyais pas comment se passer ces conditions. Mais là j'y vois plus claire.
merci le.iota.
En ce qui concerne upstart, le manuel me renvoi sur la page d'init et comme tu l'a dit, init prend en charge les processus orphelins.
Je te remercie pour tout.

Hors ligne

#6 Le 24/01/2018, à 21:34

le.iota

Re : [résolut] fonction fork() et upstart

Baldriel a écrit :

upstart

peux tu recopier ici le man d'upstart ?

es-tu resté à sysvv ? Tu peux peut-être ajouter quelque chose style

char chaine [32] ; // pas sûr de la syntaxe ni de la taille
fork()&&printf(chaine="je suis le père");
||fork()&&(chaine="Je suis le fils")
||chaine="je suis le premier petit-fils")
&&fork()||chaîne="Je suis le deuxième petit fils" // bon  l'idée est là mais ça ne marche pas comme ça

printf ("%s, mon pid est %i, le pid de mon père est %i,", chaine, getpid(),getppid())

Je suis fatigué, je ne vais pas pouvoir t'aider plus ce soir smile

Hors ligne

#7 Le 24/01/2018, à 21:50

Baldriel

Re : [résolut] fonction fork() et upstart

voici ce que dit le man:
"NAME
            init - Upstart process management deamon
SYNOPSIS
            init [option]. . .
DESCRIPTION
            init is the parent of all process [...]
"

le.iota a écrit :

es-tu resté à sysvv ?

oui
En ce qui concerne le code je vais essayer de le mettre en œuvre.

le.iota a écrit :

Je suis fatigué, je ne vais pas pouvoir t'aider plus ce soir smile

ne t'en fais pas, je vais faire de même.

Hors ligne