1) Faire des références mutuelles entre deux classes, çai mal. Je pense même qu'en Java, par exemple, ce ne serait pas possible (je me trompe peut-être, que les experts ne m'en veuillent pas). En général, cela traduit une erreur de conception.
2) Tu ne peux bien sûr pas définir un objet de chaque type dans l'autre classe, par contre tu peux effectivement utiliser une référence ou un pointeur (ce qui est pratique pour les listes chaînées). Sauf qu'une classe étant définie après l'autre, au moment où tu définis « voiture », ton compilo ne sait pas encore que « Personne » est une classe, donc un type de données.
Solution : utiliser des prototypes.
class voiture;
class Personne;
class voiture { ...
Mais je répète : les références circulaires, en général, sapuduku.
je passe à la repêche un examen de programmation système (demain matin 8h30...)
Ah, ouais ! quand même ! :-)
2/Une ecriture sur un tube sans lecteurs en mode bloquant provoque l'envoi du signal SIGPIPE au processus ecrivain, même si celui-ci a la place d'ecrire dans le tube.
Vrai (pas sur)
Non. C'est même à cela que servent les tubes nommés. A se donner rendez-vous de manière asynchrone. Par contre, il y a des chances de se prendre un SIGPIPE si le lecteur REFERME son handler.
3/ Un processus n'effectuant aucun appel systeme n'est pas interruptible par un signal, car les signaux ne sont délivrés que lors du passage en mode noyau.
Faux (on peux toujours envoyer un kill -9)
Pas seulement. Même si tu fais un while(1);, ton processus pourra être préempté ! C'est à ça que servent les signaux. Et c'est pour cela que l'on peut faire un Ctrl-C dessus.
4/ La terminaison d'un processus provoque la terminaison de tous ses fils. Vrai (quoique vérifie dans quel cas il passe zombi et dans quel cas il quitte proprement)
Oui, c'est vrai, mais le processus peut prendre les devants pour s'émanciper. Par contre, cela n'a rien à voir avec les zombies, qui sont des processus morts mais qui ne peuvent être incinérés avant que le père n'ait reconnu le corps.
6/ En terme d'espace disque, la création réussie d'un lien physique (par le shell: ln titi toto ou par l'appel link) est plus coûteuse que la création réussie d'un lien symbolique.
Vrai (12 octet contre 14k pour le lien physique)
Quoi ? O_O
1/Expliquer pourquoi il est en général préférable d'utiliser les fonctions d'entrées-sorties de haut niveau plutot que celle de bas niveau? Meilleur perf, meilleures possibilité donnée au compilo pour optimiser le tout.
Pas le compilateur, mais le système lui-même. En particulier, on permet au processus de rester en userland le maximum du temps et de limiter les appels au noyau.
2/ Qu'est-ce qu'une fonction réentrante? Illustrer sur un exemple le type de problème que peut poser l'utilisation de fonctions non réentrantes.
Si mes souvenirs sont bon, c'est une fonction qui repartira au même endroit si elle a été interrompue par un signal.
Non. C'est une fonction qui, sans être explicitement récursive, sera quand même directement ou indirectement dépendante d'elle-même, ce qui fait qu'elle se mordra la queue. Exemple à la con :
int fprintf (FILE * f, char * message)
{
if (f) /* Fichier ouvert ? */
{
Ecrire message
}
else fprintf (stderr,"Erreur : fichier non ouvert");
}
3/ Quelle différence y'a-t-il entre attente active et attente passive? Donner un exemple de chacune des deux.
Dans quel contexte ?
sleep (attente passive)
select(attente active)
Non plus. Ces deux fonctions sont toutes les deux passives et attendent le feu vert du système pour se réveiller. Une attente active est lorsque l'on provoque soit même une temporisation, ou bien lorsqu'on boucle bêtement en attendant qu'une condition soit remplie :
while (!feu_vert); /* Attend le bon moment */.
Pas la peine de dire que le programme en question va bouffer 100% du CPU.
1/ Quels appels systèmes ou bibliothèque pourrait-on utiliser pour ecrire un programme dont le lancement équivaut à ls rep? Quels sont les permissions nécessaire pour que cette commande réussise?
getdents()
man getdents :
This is not the function you are interested in. Look at readdir(3) for the POSIX conforming C library interface. This page documents the bare kernel system call interface.
3/ Que peut-on en déduire pour les permissions positionnées sur le répertoire rep?
Je vois pas comment c'est possible.
Parce que si il peux lister c'est qu'il a les droits x (traverser le répertoire) et r (lire la liste des fichiers)
Et ls -l donnera la liste de ces mêmes fichiers avec un descriptif long.
Essaie chmod 111 rep, c'est marrant.
Les gars ! relisez-vous un peu, quoi. C'était pour un exam !
C'est surtout que l'on risque rien tant que les brevets logiciels n'ont aucune valeur chez nous. Après ...
Pour les cas présents, il est très facile de démontrer l'antériorité de l'affaire. Pour le reste, on risque d'entrer dans des batailles juridiques sans fin avant d'arriver à prouver sa bonne foi, mais ça tout le monde le sait déjà. Sauf que nous ne sommes pas (encore) des américains, dont toute la société est basée sur le dollar. Ce n'est pas un jugement de valeur, c'est juste que le modèle serait encore plus nocif s'il était transposé chez nous qu'il ne l'est déjà outre-atlantique.
Le point le plus sensible des brevets qui a quand même une légitimité dans des cas de figure hors-logiciel est qu'il doit impérativement correspondre à une invention "non-triviale même pour les gens du métier". Et c'est sur que lorsque l'on en est à breveter la scrollbar, aller prouver à chaque fois que n'importe quel codeur en a eu l'idée dans son garage, c'est plus difficile.
" Face " à Microsoft, rien du tout. Je pense que le système va continuer à se développer exactement de la manière dont il le fait, asymptotiquement. Avec le temps, de plus en plus de gens en entendent parler, ce qui légitimise le système et augmente le nombre d'adeptes. Cela permet aux gens sérieux de travailler.
Les consommateurs eux-mêmes commencent à brandir l'argument Linux lorsqu'ils estiment qu'il y a du laxisme chez Redmond, surtout dans l'espoir que celui-ci réagisse avant d'être réellement contraints d'avoir à franchir le pas. C'est très bien comme ça. Un gros marché de masse qui tire le prix des machines vers le bas et un "contre-pouvoir". Linux permet même à Microsoft d'éviter les lois anti-trust dans une certaine mesure et il me semble bien que c'est ce à quoi le juge Jackson avait conclu.
Par contre, on risque vraiment très gros face aux lois stupides. Tout le monde sait désormais que la LCEN et la loi sur les DADVSI n'ont pas été promulguées pour le bien de nos concitoyens mais bien pour poser le premier maillon de la chaîne TCPA.
Il est déjà illégal de visionner un DVD acquis légalement sous Linux, même sur un lecteur officiellement estampillé " DVD " parce que les textes ne condamnent même plus l'effraction mais le fait en soi de casser une serrure (ce qui, transposé dans le monde réel, enverrait tous les serruriers en prison).
D'ici à ce qu'un texte impose à toute l'activité informatique l'usage d'une puce Fritz pour éviter les virus et combattre la guerre de l'information, et on ne pourra même plus acheter de microcontrôleur en France ...
Il y a problablement un timeout au niveau du kernel. Ca arrive par exemple avec le NFS ... il faut identifier où, mais par forum interposé c'est très difficile.
Est-ce qu'il y a de l'activité disque pendant ces moments d'attente ?
Des services devenus lents au démarrage, ça peut être le signe d'un timeout, mais dans ton cas de figure, on dirait que quelque chose part dans une boucle infinie.
En général, un processus fou consomme 100% du CPU, mais ne ralentit pas le reste car il se fait préempter facilement. Si tout le reste est lent, il y a probablement quelque chose qui travaille sur le disque.
Essaie de faire un top dans une console pour voir ce qui pourrait bien être aussi gourmand ...
void f2()
{
Objet obj (); /* <- NE PAS METTRE DE PARENTHESES ! */
obj.print();
}
En tout cas, pas par défaut. De la même façon que tu vas faire un int x, tu va faire un Object obj;. Type et nom de variable.
Le fait que tu puisse mettre des parenthèses te permet de choisir le constructeur qui doit être appelé, quand il y en a plusieurs.
Quand tu crées une variable en C, il reserve de la place dans la pile, en plus de ce qu'il y met déjà (sauvegarde des registres, adresse de retour et paramètres de la fonction). Eventuellement, il peut affecter une valeur par défaut à la place réservée.C'est d'ailleurs pour cette raison que C t'impose de déclarer toutes tes variables en début de bloc : spécialement parce que ce n'est PAS dynamique, mais déterminé au moment de la compilation (ce qui, en soi, est génial).
D'ailleurs, message perso aux afficionados de la qualité du code : il y a certains chefs de projets qui mettent un point d'honneur à vérifier que toutes les boucles et opérations conditionnelles (if while etc ...) soit bien encadrées dans des accolades. On leur répondra que 1) Si le langage permet certaines facilités, c'est pour des raisons précises 2) les accolades en C sont pratiquement toujours synonymes d'ouverture d'un nouveau cadre de pile et que la plupart des gens ne le savent plus 3) laissez les coders faire leur boulot :-)
La réservation de cette place ce fait d'ailleurs simplement en décalant le pointeur de pile de n octets. En C++, il faudra peut-être appeler une fonction plus sophistiquée pour mettre ton objet au propre : le constructeur. Celui-ci est donc appelé automatiquement en lui passant l'adresse de la mémoire fraîchement allouée.
Lorsque ta fonction se termine, en C, pour libérer la mémoire dans la pile, il suffit de faire remonter le pointeur de pile et de laisser tout le reste en l'état. En C++, il y a aura peut-être des ressources internes à libérer, donc les destructeurs seront appelés automatiquement aussi, mais fondamentalement, la mémoire allouée est la même qu'en C.
new et delete maintenant, c'est exactement la même chose que malloc et free en C. Ca sert à faire une allocation explicite d'un objet, et ne le libérer que lorsque le programmeur le décide explicitement. Et la, ça fonctionne aussi comme en C : une zone mémoire réservée, distincte de la pile, avec un tas, une table d'allocation, et une fragmentation mémoire.
Posté par Obsidian .
En réponse au message String.h.
Évalué à 1.
- Pas de majuscule à String (ce n'est pas du Java).
- Pas de ".h" au bout des noms des fichiers d'entêtes dans le code en C++ (même si la recommandation précise que ça doit marche quand même) ...
Surtout qu'ici, "string.h", c'est toujours le fichier de déclaration des fonctions C.
Ensuite, le namespace que va bien, effectivement ...
En réalité ce n'était pas vraiment un bug. En fait, le bâtiment ne tombait en panne systématiquement, mais facilement au deuxième ou troisième tir. C'était surtout une erreur de dosage ...
En réalité, je ne crois pas avoir un jour fini une campagne de Blue War. Trop long. Le temps passait plus lentement à cette époque.
Avec le sous-marin qui affichait une avarie chaque fois que l'on tirait une torpille ! :-)
Du coup, je ne sais pas si j'ai pu finir une mission, mais je me suis quand même bien amusé à explorer les sources, le jeu étant écrit en basic sur Thomson, à l'époque ...
[^] # Re: Hum, réfléchis
Posté par Obsidian . En réponse au message concatenation de chaine. Évalué à 4.
C'est vrai que les char mallow(), c'est bien meilleur. Surtout autour d'un feu de camp ! :-)
[^] # Re: Et l'eau !
Posté par Obsidian . En réponse au journal Mettre de l'huile dans l'eau des pâtes ?. Évalué à 3.
[^] # Re: Troll de compet'
Posté par Obsidian . En réponse au journal BlueGene/P...enfin le petaflop !. Évalué à 1.
# Décoration des fonctions.
Posté par Obsidian . En réponse au message librairie synamique compilé en C linké en c++. Évalué à 4.
Essaie de mettre ton header de lib à l'intérieur de
extern "C"
{
#include "malib.h"
}
# Relis.
Posté par Obsidian . En réponse au message fichier d'en tête fich.h. Évalué à 4.
https://linuxfr.org/forums/20/22392.html
1) Faire des références mutuelles entre deux classes, çai mal. Je pense même qu'en Java, par exemple, ce ne serait pas possible (je me trompe peut-être, que les experts ne m'en veuillent pas). En général, cela traduit une erreur de conception.
2) Tu ne peux bien sûr pas définir un objet de chaque type dans l'autre classe, par contre tu peux effectivement utiliser une référence ou un pointeur (ce qui est pratique pour les listes chaînées). Sauf qu'une classe étant définie après l'autre, au moment où tu définis « voiture », ton compilo ne sait pas encore que « Personne » est une classe, donc un type de données.
Solution : utiliser des prototypes.
class voiture;
class Personne;
class voiture { ...
Mais je répète : les références circulaires, en général, sapuduku.
[^] # Re: Réponse (a vérifier)
Posté par Obsidian . En réponse au message Questions d'exam. Évalué à 2.
Le second, c'est qu'il ne consomme pas d'inode supplémentaire.
C'est bien le même fichier référencé deux fois.
[^] # Re: Réponse (a vérifier)
Posté par Obsidian . En réponse au message Questions d'exam. Évalué à 2.
[^] # Re: Réponse (a vérifier)
Posté par Obsidian . En réponse au message Questions d'exam. Évalué à 2.
Ah, ouais ! quand même ! :-)
Non. C'est même à cela que servent les tubes nommés. A se donner rendez-vous de manière asynchrone. Par contre, il y a des chances de se prendre un SIGPIPE si le lecteur REFERME son handler.
Pas seulement. Même si tu fais un while(1);, ton processus pourra être préempté ! C'est à ça que servent les signaux. Et c'est pour cela que l'on peut faire un Ctrl-C dessus.
Oui, c'est vrai, mais le processus peut prendre les devants pour s'émanciper. Par contre, cela n'a rien à voir avec les zombies, qui sont des processus morts mais qui ne peuvent être incinérés avant que le père n'ait reconnu le corps.
Quoi ? O_O
Pas le compilateur, mais le système lui-même. En particulier, on permet au processus de rester en userland le maximum du temps et de limiter les appels au noyau.
Non. C'est une fonction qui, sans être explicitement récursive, sera quand même directement ou indirectement dépendante d'elle-même, ce qui fait qu'elle se mordra la queue. Exemple à la con :
int fprintf (FILE * f, char * message)
{
if (f) /* Fichier ouvert ? */
{
Ecrire message
}
else fprintf (stderr,"Erreur : fichier non ouvert");
}
Non plus. Ces deux fonctions sont toutes les deux passives et attendent le feu vert du système pour se réveiller. Une attente active est lorsque l'on provoque soit même une temporisation, ou bien lorsqu'on boucle bêtement en attendant qu'une condition soit remplie :
while (!feu_vert); /* Attend le bon moment */.
Pas la peine de dire que le programme en question va bouffer 100% du CPU.
man getdents :
This is not the function you are interested in. Look at readdir(3) for the POSIX conforming C library interface. This page documents the bare kernel system call interface.
Essaie chmod 111 rep, c'est marrant.
Les gars ! relisez-vous un peu, quoi. C'était pour un exam !
[^] # Re: Et au final...
Posté par Obsidian . En réponse au journal Un OS réécrit son code à la volée. Évalué à 2.
Perso, pas de problème. Je veux bien leur laisser ...
[^] # Re: breveté ou pas ?
Posté par Obsidian . En réponse au message Avenir de GNU/Linux. Évalué à 2.
Pour les cas présents, il est très facile de démontrer l'antériorité de l'affaire. Pour le reste, on risque d'entrer dans des batailles juridiques sans fin avant d'arriver à prouver sa bonne foi, mais ça tout le monde le sait déjà. Sauf que nous ne sommes pas (encore) des américains, dont toute la société est basée sur le dollar. Ce n'est pas un jugement de valeur, c'est juste que le modèle serait encore plus nocif s'il était transposé chez nous qu'il ne l'est déjà outre-atlantique.
Le point le plus sensible des brevets qui a quand même une légitimité dans des cas de figure hors-logiciel est qu'il doit impérativement correspondre à une invention "non-triviale même pour les gens du métier". Et c'est sur que lorsque l'on en est à breveter la scrollbar, aller prouver à chaque fois que n'importe quel codeur en a eu l'idée dans son garage, c'est plus difficile.
# Face à Microsoft ?
Posté par Obsidian . En réponse au message Avenir de GNU/Linux. Évalué à 3.
Les consommateurs eux-mêmes commencent à brandir l'argument Linux lorsqu'ils estiment qu'il y a du laxisme chez Redmond, surtout dans l'espoir que celui-ci réagisse avant d'être réellement contraints d'avoir à franchir le pas. C'est très bien comme ça. Un gros marché de masse qui tire le prix des machines vers le bas et un "contre-pouvoir". Linux permet même à Microsoft d'éviter les lois anti-trust dans une certaine mesure et il me semble bien que c'est ce à quoi le juge Jackson avait conclu.
Par contre, on risque vraiment très gros face aux lois stupides. Tout le monde sait désormais que la LCEN et la loi sur les DADVSI n'ont pas été promulguées pour le bien de nos concitoyens mais bien pour poser le premier maillon de la chaîne TCPA.
Il est déjà illégal de visionner un DVD acquis légalement sous Linux, même sur un lecteur officiellement estampillé " DVD " parce que les textes ne condamnent même plus l'effraction mais le fait en soi de casser une serrure (ce qui, transposé dans le monde réel, enverrait tous les serruriers en prison).
D'ici à ce qu'un texte impose à toute l'activité informatique l'usage d'une puce Fritz pour éviter les virus et combattre la guerre de l'information, et on ne pourra même plus acheter de microcontrôleur en France ...
[^] # Re: Ils sont gentils dans l'éducation
Posté par Obsidian . En réponse au journal Wikipedia encoe attaqué dans l'éducation. Évalué à 4.
Déclarer que " l'orthographe est la science du pauvre ", c'est se dédouaner un peu vite, je trouve.
[^] # Re: Ils sont gentils dans l'éducation
Posté par Obsidian . En réponse au journal Wikipedia encoe attaqué dans l'éducation. Évalué à 2.
Y en a :
http://www.priceminister.com/offer/buy/1245319/Duhamel-Jerom(...)
[^] # Re: Top + Timeout
Posté par Obsidian . En réponse au message Système lent après crash du à plus de batterie. Évalué à 2.
# Top + Timeout
Posté par Obsidian . En réponse au message Système lent après crash du à plus de batterie. Évalué à 2.
Des services devenus lents au démarrage, ça peut être le signe d'un timeout, mais dans ton cas de figure, on dirait que quelque chose part dans une boucle infinie.
En général, un processus fou consomme 100% du CPU, mais ne ralentit pas le reste car il se fait préempter facilement. Si tout le reste est lent, il y a probablement quelque chose qui travaille sur le disque.
Essaie de faire un top dans une console pour voir ce qui pourrait bien être aussi gourmand ...
[^] # Re: stty
Posté par Obsidian . En réponse au message Ctrl-c ne fonctionne pas. Évalué à 2.
# Faire l'inverse
Posté par Obsidian . En réponse au message expression rationnelle particuliere. Évalué à 2.
:%s/[^\\]*\(\\line\|\\par\)\?\|.*/\1/g
[^] # Re: la fonction f1 devrait s'écrire comme f2
Posté par Obsidian . En réponse au message Constructeur, destructeur, et autre.... Évalué à 3.
# Bien différencier C++ et Java !
Posté par Obsidian . En réponse au message Constructeur, destructeur, et autre.... Évalué à 3.
{
Objet obj (); /* <- NE PAS METTRE DE PARENTHESES ! */
obj.print();
}
En tout cas, pas par défaut. De la même façon que tu vas faire un int x, tu va faire un Object obj;. Type et nom de variable.
Le fait que tu puisse mettre des parenthèses te permet de choisir le constructeur qui doit être appelé, quand il y en a plusieurs.
Quand tu crées une variable en C, il reserve de la place dans la pile, en plus de ce qu'il y met déjà (sauvegarde des registres, adresse de retour et paramètres de la fonction). Eventuellement, il peut affecter une valeur par défaut à la place réservée.C'est d'ailleurs pour cette raison que C t'impose de déclarer toutes tes variables en début de bloc : spécialement parce que ce n'est PAS dynamique, mais déterminé au moment de la compilation (ce qui, en soi, est génial).
D'ailleurs, message perso aux afficionados de la qualité du code : il y a certains chefs de projets qui mettent un point d'honneur à vérifier que toutes les boucles et opérations conditionnelles (if while etc ...) soit bien encadrées dans des accolades. On leur répondra que 1) Si le langage permet certaines facilités, c'est pour des raisons précises 2) les accolades en C sont pratiquement toujours synonymes d'ouverture d'un nouveau cadre de pile et que la plupart des gens ne le savent plus 3) laissez les coders faire leur boulot :-)
La réservation de cette place ce fait d'ailleurs simplement en décalant le pointeur de pile de n octets. En C++, il faudra peut-être appeler une fonction plus sophistiquée pour mettre ton objet au propre : le constructeur. Celui-ci est donc appelé automatiquement en lui passant l'adresse de la mémoire fraîchement allouée.
Lorsque ta fonction se termine, en C, pour libérer la mémoire dans la pile, il suffit de faire remonter le pointeur de pile et de laisser tout le reste en l'état. En C++, il y a aura peut-être des ressources internes à libérer, donc les destructeurs seront appelés automatiquement aussi, mais fondamentalement, la mémoire allouée est la même qu'en C.
new et delete maintenant, c'est exactement la même chose que malloc et free en C. Ca sert à faire une allocation explicite d'un objet, et ne le libérer que lorsque le programmeur le décide explicitement. Et la, ça fonctionne aussi comme en C : une zone mémoire réservée, distincte de la pile, avec un tas, une table d'allocation, et une fragmentation mémoire.
[^] # Re: re
Posté par Obsidian . En réponse au message String.h. Évalué à 1.
- Pas de ".h" au bout des noms des fichiers d'entêtes dans le code en C++ (même si la recommandation précise que ça doit marche quand même) ...
Surtout qu'ici, "string.h", c'est toujours le fichier de déclaration des fonctions C.
Ensuite, le namespace que va bien, effectivement ...
[^] # Re: Des bons souvenirs, ça ...
Posté par Obsidian . En réponse à la dépêche Danger from the Deep : version 0.3.0 disponible. Évalué à 3.
En fait, les émulateurs Thomson existent depuis belle lurette :
http://membres.lycos.fr/jth/emuto8.html
Blue War doit même être disponible, tiens ...
[^] # Re: Des bons souvenirs, ça ...
Posté par Obsidian . En réponse à la dépêche Danger from the Deep : version 0.3.0 disponible. Évalué à 1.
En réalité ce n'était pas vraiment un bug. En fait, le bâtiment ne tombait en panne systématiquement, mais facilement au deuxième ou troisième tir. C'était surtout une erreur de dosage ...
En réalité, je ne crois pas avoir un jour fini une campagne de Blue War. Trop long. Le temps passait plus lentement à cette époque.
[^] # Re: Des bons souvenirs, ça ...
Posté par Obsidian . En réponse à la dépêche Danger from the Deep : version 0.3.0 disponible. Évalué à 2.
Avec le sous-marin qui affichait une avarie chaque fois que l'on tirait une torpille ! :-)
Du coup, je ne sais pas si j'ai pu finir une mission, mais je me suis quand même bien amusé à explorer les sources, le jeu étant écrit en basic sur Thomson, à l'époque ...
# Des bons souvenirs, ça ...
Posté par Obsidian . En réponse à la dépêche Danger from the Deep : version 0.3.0 disponible. Évalué à 1.
[^] # Re: et $? ?
Posté par Obsidian . En réponse au message une erreur sur while [ `grep $uid /etc/passwd` ]. Évalué à 2.