Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Bêta ON] La programmation système en C sous Unix

Dans la catégorie "C" par lucas-84

17 décembre 2010 à 18:34:43

Lire le tutoriel
Tuto ouvert aux bêta-tests
Réservé aux membres

  • Partager sur Facebook
  • Partager sur Twitter
17 décembre 2010 à 18:34:45

Bonjour à tous,

Je souhaitais, avant de faire une demande de publication, proposer ce tutoriel à la communauté pour déceler les erreurs de mon tutoriel.

Il s'agit, comme son nom l'indique, d'un big-tuto sur la programmation système en C sous Linux.
Les premiers chapitres sont relativement simples, ils traitent sur la façon de créer un processus et sur comment exécuter un programme à partir de son programme.

Un chapitre sur les tubes est en cours de rédaction.

Bonne journée ou bonne soirée à vous tous,

lucas-84
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
Anonyme
17 décembre 2010 à 19:43:14

Après avoir lu ton tutoriel, je me demande si ton tutoriel est encore à l'état d'ébauche.

De plus, j'ai vraiment l'impression que tu ne cherche pas du tout à faire comprendre quoi que ce soit au lecteur, mais que tu te contente de faire une sorte de manuel d'utilisation de ce que tu appelle programmation système.
En fait, tu parles de processus, de couches logicielles, de noyau, d'appels systèmes, mais tu n'explique pas vraiment ce que c'est...

On dirait un cours du style : faites comme ca et ne cherchez pas à comprendre, c'est un ordre !
C'est un peu triste, surtout que le sujet de la programmation système est assez passionnant.

Et il y a beaucoup de choses qui manquent : tu ne parles pas systèmes d'exploitation, d'abstraction matérielle, de gestion mémoire, ni d'ordonnancement...Tu fais juste quelques remarques dessus, rien de plus.

Sinon, niveau "erreurs" (c'est plus des imprécisions)

  • Tu différencie les programmes systèmes et applicatifs, mais ce n'est vrai que pour les PC avec un OS installé !
  • Tu prétends que la programmation système sert à créer des applications avec interface graphique... ca sert aussi à créer des drivers , des OS, à communiquer avec des périphériques...
  • Un processus en sommeil n'est pas en attente d'un évènement, mais attend que le scheduler lui attribue un quantum de temps.
  • je te cite "Ceux qui ne disposent pas de ce plaisir :p , il va falloir soit passer à Linux (la solution radicale :D ) ; soit programmer avec un langage comme l'assembleur." : désolé, mais de nos jours, la programmation système c'est quasiment que du C. Et on peut en faire sous windows.
  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2010 à 11:45:56

Eh bien je te remercie pour toutes ces remarques, qui sont très intéressantes.
Je vais essayer d'arranger tout ça,

lucas-84

EDIT : Voici les erreurs corrigées :

Citation : mewtow

Tu différencie les programmes systèmes et applicatifs, mais ce n'est vrai que pour les PC avec un OS installé !



J'ai ajouté quelques mots dessus dans l'introduction du tutoriel.

Citation : mewtow

Tu prétends que la programmation système sert à créer des applications avec interface graphique... ca sert aussi à créer des drivers , des OS, à communiquer avec des périphériques...



Ajout d'un paragraphe dans le chapitre 1 : Avant de commencer / Introduction / Qu'est ce que nous allons faire

Citation : mewtow

Un processus en sommeil n'est pas en attente d'un évènement, mais attend que le scheduler lui attribue un quantum de temps.



Corrigé

Citation : mewtow


je te cite "Ceux qui ne disposent pas de ce plaisir :p , il va falloir soit passer à Linux (la solution radicale :D ) ; soit programmer avec un langage comme l'assembleur." : désolé, mais de nos jours, la programmation système c'est quasiment que du C. Et on peut en faire sous windows.



J'ai carrément supprimé le paragraphe.

Citation : mewtow

tu ne parles pas systèmes d'exploitation, d'abstraction matérielle, de gestion mémoire, ni d'ordonnancement



abstraction matérielle ==> j'ai modifié Avant de commencer / Généralités sur le développement sous Linux, le terme est légèrement abordé.

ordonnancement ==> Ajout d'un paragraphe dessus dans Les processus / Notions

EDIT 2 : De plus, j'ai une question : si jamais mon tutoriel venait à être de bonne qualité et que je puisse envisager une validation, dans quelle catégorie devrais-je mettre mon tutoriel ?

Merci d'avance,

lucas-84
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
18 décembre 2010 à 18:51:50

j'ai lu le début et je ne connais rien a la programmation système :-) mais je pense que le 1er chapitre devrai être plus long pour mieux comprendre a quoi sa sert et tous ce que l'on peut faire avec...
En tous les cas n'abandonne pas , j'attend ton tuto avec impatience et je ne pense pas être le seul.
Bonne continuation.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
18 décembre 2010 à 18:57:41

Citation : lucas-84

De plus, j'ai une question : si jamais mon tutoriel venait à être de bonne qualité et que je puisse envisager une validation, dans quelle catégorie devrais-je mettre mon tutoriel ?



Et bien...C'est une bonne question, mais ton tutoriel peut convenir pour plusieurs catégories en même temps.

Au choix :
  • Systèmes exploitation => sous catégorie linux
  • Programmation = > sous catégorie sur le langage C


Sinon, tu as fais pas mal de corrections, dommage que ton tutoriel soit en bêta off, j'aurais bien aimé voir ce que ca donne.

Et je tiens à corriger une erreur dans ce que je t'ai dis plus haut :

Quand je dis:
Un processus en sommeil n'est pas en attente d'un évènement, mais attend que le scheduler lui attribue un quantum de temps.


En fait, c'est vrai que pour le multitâche préemptif... Boulette.

Mais je pense carrément qu'il faudrait que tu mettes un paragraphe complet sur l'ordonnancement et les multitâche préemptif et coopératifs, que tu explique ce que c'est. Surtout si dans la suite tu comptes parler de threads.
En fait, je te conseille carrément de faire un cours complet sur l'ordonnancement, mais ca dévierait carrément du but de ton tutoriel je pense...

Sinon, j'attends la suite.

  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2010 à 9:48:33

Merci pour vos encouragements :D ,

Je viens de repasser le tutoriel en Bêta ON.

Citation : mewtow

Mais je pense carrément qu'il faudrait que tu mettes un paragraphe complet sur l'ordonnancement et les multitâche préemptif et coopératifs, que tu explique ce que c'est. Surtout si dans la suite tu comptes parler de threads.
En fait, je te conseille carrément de faire un cours complet sur l'ordonnancement, mais ca dévierait carrément du but de ton tutoriel je pense...



Bon je vais détailler un peu plus mon paragraphe sur l'ordonnancement.
Mais ça commence à faire un peu beaucoup de nouveautés dans le premier chapitre pratique...

Citation : mewtow

Un processus en sommeil n'est pas en attente d'un évènement, mais attend que le scheduler lui attribue un quantum de temps.
En fait, c'est vrai que pour le multitâche préemptif... Boulette.



Bon je vais re-corriger ça ^^

Merci encore,

lucas-84
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
19 décembre 2010 à 23:41:16

Salut,

Ce n'est pas sur le fond mais sur la forme :
http://www.siteduzero.com/tutoriel-3-3 [...] rocessus.html
Il manque une parenthèse dans Présentation des processus :

Citation

La deuxième colonne PID indique le numéro de PID du processus (nous allons voir ce que c'est juste après).



Et dans Créer un nouveau processus :

Citation

Le processus père et le processus père fils ont le même code source, mais la valeur retournée par fork() nous permet de savoir si l'on est dans le processus père ou dans le processus fils.



J'attends la suite avec impatience :)

++
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2010 à 12:45:49

Merci beaucoup pour ces corrections, je vais m'en occuper :)
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
20 décembre 2010 à 16:27:46

Le titre semple pompé sur ce livre :

http://www.editions-eyrolles.com/Livre [...] -c-sous-linux

J'ai lu ni le tuto ni le livre, j'espere juste que le contenu n'est pas pompé lui aussi.

Bonne continuation.
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2010 à 16:37:43

Mmmh quelle remarque constructive !
En même quand on fait de la programmation système en langage C sous Linux, il n'y a pas 36000 titres possibles.
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2010 à 18:58:13

Je l'attendais celle-là. :D

En fait, tout a commencé le jour où j'ai vu dans les demandes de tutoriel une forte demande sur la programmation système.

Je me suis lancé alors dessus.
Vu que je travaille sous Linux et que je maîtrisais très bien le C, et comme en plus j'ai vu que le système Linux était fait à 90% en C (source : wikipédia), je me suis renseigné sur ce type de programmation.

Et à ce moment-là, et seulement à ce moment-là, j'ai découvert le livre de Christophe BLAESS sur la programmation système en C sous Linux. C'est de ce livre que je tire (une partie seulement !) de mes connaissances. Mais vous pouvez vérifier, le tutoriel n'est en aucun cas une copie de ce livre. Je m'en suis un petit peu inspiré sur la structure, mais sur tous les autres tutoriels du Web, l'étude se commence par les processus, puis par comment exécuter un programme.

Je me défend donc de toute attaque sur ce sujet.
Le contenu de mon tutoriel n'est pas du plagiat.

Au passage, au niveau du titre de mon tuto, je me demande bien ce que j'aurais pu mettre : il s'agit de programmation système donc je suis obligé de le mettre. C'est sous Linux, ça ne marche pas sous Windows donc...
Et puis c'est un tuto sur le C et non pas sur l'ASM, donc "en C".

Bon, c'était le petit passage de la défense,
sur ce, bonne soirée à tous,

Lucas84
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
20 décembre 2010 à 21:45:40

Bonsoir,

J'ai parcouru ton premier chapitre et je dois reconnaître qu'il y a de l'idée ;)

Par contre, n'hésites pas à approfondir! Tu ne peux pas savoir à quel point la programmation système intéresse comme monde :D

En vrac, pourquoi ne pas, comme l'a suggéré Mewtow, parler de gestion de la mémoire, d’ordonnancement, d'OS & co même si tu dois leurs consacrer un chapitre entier?
Un truc qui m'a plu est ton paragraphe "notions". C'est une belle introduction au sujet et selon moi, tu pourrais bien mettre un paragraphe de ce type pour chaque chapitre :p

Sinon, j'ai une petite question, pourquoi fais tu 2 if différents pour le même fork() ?
Il n'est pas plus court et lisible d'utiliser un seul switch?

pid_fils = fork ( );
switch(pid_fils)
{
    case -1:
    perror("fork:");
    break:
    case 0:
    //fils
    break;
    default:
    //père
    break;
    
}


Maintenant, il y a peut-être une raison cachée en faveur des if :-°


Pour finir, encore bravo et bonne continuation!
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2010 à 22:22:27

Tuto très intéressant, j'attend la suite avec impatience
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2010 à 21:13:00

Citation : lucas-84

Je l'attendais celle-là. :D

En fait, tout a commencé le jour où j'ai vu dans les demandes de tutoriel une forte demande sur la programmation système.

Je me suis lancé alors dessus.
Vu que je travaille sous Linux et que je maîtrisais très bien le C, et comme en plus j'ai vu que le système Linux était fait à 90% en C (source : wikipédia), je me suis renseigné sur ce type de programmation.

Et à ce moment-là, et seulement à ce moment-là, j'ai découvert le livre de Christophe BLAESS sur la programmation système en C sous Linux. C'est de ce livre que je tire (une partie seulement !) de mes connaissances. Mais vous pouvez vérifier, le tutoriel n'est en aucun cas une copie de ce livre. Je m'en suis un petit peu inspiré sur la structure, mais sur tous les autres tutoriels du Web, l'étude se commence par les processus, puis par comment exécuter un programme.

Je me défend donc de toute attaque sur ce sujet.
Le contenu de mon tutoriel n'est pas du plagiat.

Au passage, au niveau du titre de mon tuto, je me demande bien ce que j'aurais pu mettre : il s'agit de programmation système donc je suis obligé de le mettre. C'est sous Linux, ça ne marche pas sous Windows donc...
Et puis c'est un tuto sur le C et non pas sur l'ASM, donc "en C".

Bon, c'était le petit passage de la défense,
sur ce, bonne soirée à tous,

Lucas84



Ah, oui, très bon livre, on me l'a offert, et je dois avouer que j'ai beaucoup appris en le lisant, pour tout ceux qui sont intéressés par la prog système, je conseil de le lire.
C'est vraiment une référence :)
  • Partager sur Facebook
  • Partager sur Twitter
- Il y a un chemin vers chaque sommet, même le plus haut -
21 décembre 2010 à 23:13:53

Bonjour,
Étudiant la programmation système dans le cadre de mes études, je ne peux que saluer votre initiative :D
J'en profite pour vous signaler une erreur: dans le dernier code source de cette partie, vous avez indiqué que le code de retour de fork en cas d'erreur est 1; or en cas d'erreur, fork retourne -1.
Ligne 10:
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char* argv[]) 
{
	char * arguments[] = {"baobab", argv[1], NULL}; // On crée un tableau contenant le nom du programme, l'argument et le dernier "NULL" obligatoire
	pid_t pid_fils;
	pid_fils = fork();

	if(pid_fils == 1)
		printf("Erreur de création du nouveau processus");

	if(pid_fils == 0)
	{
		execv("/usr/bin/baobab", arguments); // On lance le programme
		printf("\nErreur d'ouverture de l'Analyseur d'Utilisation des Disques\n"); // Message d'erreur : cette partie ne doit pas être exécutée
	}

	printf("\n\nSi ce texte s'affiche, nous avons résolu notre problème !\n");
	return 0;
}

Je suppose que c'est une faute de frappe, comme vous n'avez pas fait cette erreur dans la partie sur les processus :)

Bon courage pour la suite de votre tuto
  • Partager sur Facebook
  • Partager sur Twitter
22 décembre 2010 à 18:08:21

Merci beaucoup pour cette remarque, je vais corriger ça ! :)
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
23 décembre 2010 à 1:44:19

je souhaiterai savoir une chose avant d'attaquer votre tutoriel, c'est qu'est ce qu'on pourrait faire avec ça, et avec la bibliothèque GTK+ à ton avis, je voudrais des exemples concrètes (comme l'a fait m@teo pour son cours en C...), merci d'avance, et bonne continuation.
  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2010 à 1:57:52

? GTK+, ça n'a rien à voir avec de la programmation système.
A la limite pourquoi pas présenter la lib termcap, mais GTK on commence à s'éloigner du sujet ;) !
  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2010 à 14:30:43

Citation : Sexymimi64

? GTK+, ça n'a rien à voir avec de la programmation système.
A la limite pourquoi pas présenter la lib termcap, mais GTK on commence à s'éloigner du sujet ;) !


Moi aussi, je me suis aussi demandé ce que cela pouvait être. Cela dit, GLib permet d'utiliser des fonctionnalités de la programmation système de façon portable, comme par exemple, les GThreads, les Spawnings Processes les GTimer, etc...
Donc ben finalement pourquoi pas...
  • Partager sur Facebook
  • Partager sur Twitter
- Il y a un chemin vers chaque sommet, même le plus haut -
24 décembre 2010 à 10:03:49

En avant-première, le chapitre 4 sur les Threads.
N'hésitez pas à commenter.
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
25 décembre 2010 à 10:19:06

Un petit up, je cherche des commentaires !
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
25 décembre 2010 à 10:42:30

Citation : artificier59

Citation : Sexymimi64

? GTK+, ça n'a rien à voir avec de la programmation système.
A la limite pourquoi pas présenter la lib termcap, mais GTK on commence à s'éloigner du sujet ;) !


Moi aussi, je me suis aussi demandé ce que cela pouvait être. Cela dit, GLib permet d'utiliser des fonctionnalités de la programmation système de façon portable, comme par exemple, les GThreads, les Spawnings Processes les GTimer, etc...
Donc ben finalement pourquoi pas...


Parce que justement, l'intérêt c'est de pas apprendre ce genre de chose.

Des abstractions pour des fonctionnalités système, t'en a dans GTK, dans Qt, dans SFML, etc... si tu veux vraiment apprendre à utiliser ce genre de chose (dev d'applis graphique avec des abstractions système complètes), il y a déjà des tutoriel sur Qt ici, qui est un framework bien plus portable... ce n'est ni le sujet du tutoriel, ni vraiment nécessaire.

Bref, l'intérêt de ce genre de tutoriel, c'est justement que le jour ou tu veux développer ta propre abstraction de fonctionnalités système sous Linux, tu sais le faire.
Et le jour ou tu veux pas utiliser d'abstraction, tu peux le faire aussi.

EDIT:
J'en ai profité pour jeter un œil au chapitre sur les threads.
Ça pourrait valoir le coup d'expliquer que ce que tu apprend dans ce tuto, ce sont les threads Posix (c'est standard quoi), et qu'ils ont notamment été porté sous Windows.

Dans "Créer un thread", si tu souhaite t'adresser même aux débutants, tu devrais t'attarder un peu plus sur le cast.
Et sur comment utiliser ce type void* pour passer en paramètre tout ce que tu veux (tu déclare une structure, l'envoi en paramètre, et bim avec le cast tu la récupère de l'autre côté, je pense que c'est le genre de cas concret qui permettra au lecteur de comprendre).
  • Partager sur Facebook
  • Partager sur Twitter
25 décembre 2010 à 11:04:28

Très bien je corrigerais ça demain, merci :)
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
26 décembre 2010 à 12:19:47

Petit up, j'ai un peu corrigé tout ça, j'attend vos commentaires :)
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
28 décembre 2010 à 22:47:34

Actuellement étudiant en L2 Info, je remarque qu'il manque le
#include <unistd.h> nécessaire pour l'utilisation de fork(),execlp,execvp.
Je sais que sur linux c'est obligatoire mais dans les autres système je ne sais pas
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2010 à 10:04:22

Merci,

Effectivement je vais le rajouter, même si le code compile quand même. :)
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
2 janvier 2011 à 15:06:46

Ca y est : le chapitre 4 sur les threads est enfin en lifne !
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
9 janvier 2011 à 0:47:04

Je ne m'y connais pas beaucoup, mais j'ai appris 2-3 choses (ici notamment) en recherchant que tu pourrais facilement ajouter dans ton tuto. Il y a aussi certains points que tu pourrais peut-être éclaircir, à toi de voir. Par exemple :

  • Expliquer plus en détail les fonctions utilisées : expliquer que pthread_mutex_lock() verrouille le mutex, mais s'il est déjà verrouillé, la fonction est «bloqué» jusqu'à ce que le mutex soit déverrouillé, etc.
  • Expliquer pourquoi la fonction pthread_cond_wait() nécessite un mutex en paramètre et préciser que le mutex reste verrouillé après la fonction.
  • Tu pourrais aller plus loin avec les mutex et montrer leur utilisation dynamique.
  • Tu devrais expliquer comment le mutex bloque l'accès à la variable.
  • J'ai de la difficulté à comprendre quelles variables sont partagées dans les threads. Tu pourrais développer sur ce point.

Sinon, je te trouve très optimiste, ne t'arrête pas. J'ai fait plus de critiques que de compliments, car elles sont plus constructif, mais il n'en est pas moins qu'il y a beaucoup de bon points.

Je n'ai pas (encore) lu l'ensemble de ton tutoriel, seulement le chapitre sur les threads, car j'en ai besoin dans un programme, mais il m'intéresse. Je l'attaquerai au moment venu.
  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2011 à 9:45:21

Merci beaucoup pour tes réponses.
Je vais essayer de rajouter quelque chose là-dessus. Seulement, le problème est que le chapitre sur les threads est déjà plutôt long...
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.