Partage
  • Partager sur Facebook
  • Partager sur Twitter

if(fork() && (fork() || fork()));

30 mai 2016 à 18:57:37

Bonsoir à tous,

J'ai trouvé cet exercice avec correction sur internet mais je n'arrive ps à comprendre la solution :

Voici l'énoncé : Exercice 1.

1. Combien de processus engendre l’évaluation de la commande C fork() && ( fork() || fork() ) ;

2. Dessiner l’arbre généalogique des processus engendrés par cette ligne

et voici la solution : 

Le processus courant (appelons-le le père) engendre dans l’ensemble 3 autres processus. En effet, comme dans une instruction a && b, b n’est pas évaluée si l’évaluation de a donne 0, de même, dans dans une instruction a || b, b n’est pas évaluée si l’évaluation de a ne donne pas 0. Donc, dans fork() && b seulement le père exécute b, et dans fork() || b seulement le fils exécute b

include <unistd.h>

int main()
{
     if(fork() && (fork() || fork()));
     sleep(10);
     exit(0);
}

C'est surtout cette ligne que je ne comprend pas : 

if(fork() && (fork() || fork()));

Que signifie un "if" avec un point virgule à la fin?

et ceci " b n’est pas évaluée si l’évaluation de a ne donne pas 0" pourquoi? vu que c'est un "OU" logique donc b devrait être évalué même si a donne 0 non?

et surtout je voudrais savoir à quel ligne les fils reprennent-ils l'exécution du code?

Merci d'avance



  • Partager sur Facebook
  • Partager sur Twitter
30 mai 2016 à 19:41:56

Hello, 

Un if avec un point virgule a la fin veux dire qu'on fais rien en fonction de la condition

exemple : 

age = 19;

if (age > 18);
printf("tu as %d age \n", age); 

Peux importe l'age, on executera toujours l'instruction printf, on se moque du retour de la condition

Pour repondre à ton deuxieme points

Dans un && (et) , si la première condition est fausse , on s’arrête la , pas besoin d'aller vérifier la deuxième condition vu que de toute façon y'en a au moin une de fausse , ce qui donne un test && (et) faux de toute façon.

Voila pourquoi.

Cependant dans un test || (ou) , on dois tester chaque condition du test car une seul suffit a valider la condition total.

autre chose , dans un main on evite le exit, vaux mieu un return (EXIT_SUCCESS)

-
Edité par Oldaric 30 mai 2016 à 19:44:57

  • Partager sur Facebook
  • Partager sur Twitter

On estime à environ 550 millions le nombre d'armes à feu actuellement en circulation. Autrement dit il y a un homme sur douze qui est armé sur cette planète. La seule question c'est … comment armer les onze autres ?

30 mai 2016 à 20:26:38

Merci de m'avoir répondu  {#emotions_dlg.heureux}

Et qu'en est-il du dernier point que je n'ai pas saisi?

à savoir  "je voudrais savoir à quel ligne les fils reprennent-ils l'exécution du code?"

Merci encore

  • Partager sur Facebook
  • Partager sur Twitter
30 mai 2016 à 20:57:15

les fils execute 

sleep(10);
exit(0);

le pere execute

sleep(10);
exit(0);


il exécute en parallèle le même code a partir du moment ou tu fork.

  • Partager sur Facebook
  • Partager sur Twitter

On estime à environ 550 millions le nombre d'armes à feu actuellement en circulation. Autrement dit il y a un homme sur douze qui est armé sur cette planète. La seule question c'est … comment armer les onze autres ?

31 mai 2016 à 2:21:15

mariane01 a écrit:

Que signifie un "if" avec un point virgule à la fin?



Formellement, la syntaxe du if sans else est:

if ( expression ) instruction

Ici, l'instruction est constituée du seule point-virgule. Cette instruction vide ne fait évidemment rien. On peut aussi utiliser une paire d'accolades vide, ça revient au même.

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2016 à 9:13:55

Wow ! Exercice probablement bien intéressant, mais on voit la différence entre un exercice et la vie réelle.

Car si un jour un mec dans une entreprise écrit :

if(fork() && (fork() || fork()));

Je crois que la peine de mort est prononcée contre lui immédiatement. :colere2:

  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

29 juin 2020 à 14:15:55

fork() && (fork() *fork())
  • Partager sur Facebook
  • Partager sur Twitter
29 juin 2020 à 14:56:54

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)