Un programme source en C est constitué
de directives de précompilations (lignes commençant par #)
de commentaires (limités par /* et */)
des déclarations ou définitions globales de variables ou de fonctions (vues de tout le programme)
une fonction principale appelée "main" qui est le point d'entrée principal dans le programme au moment de son exécution
un bloc principal lié à main délimité par { et }
et à l'intérieur du bloc principal
des déclarations ou définitions de variables ou fonctions locales au programme principal (mais globales pour les fonctions incluses!)
des instructions ou des blocs d'instructions délimités par { et }
toutes les instructions ou déclarations ou définitions sont suivies d'un ";"
Exemple sur le dernier exercice :
#include<stdio.h> /*Directive de précompilation (le préprocesseur va inclure le fichier entête stdio qui "déclare" les fonctions standard d'entrée-sortie*/
/* pas de déclaration ni définition globale*/
int main() /* définition de la fonction principale main qui dans cet exemple est supposée retourner un entier et ne possède pas d'arguments d'appel*/
{/* accolade de début de la fontion principale */
char c; /* déclaration d'une variable de type "char"*/
printf("Entrez un caractère : \n (p pour quitter) \n"); /* appel de la fonction printf avec un seul argument : une constante chaîne de caractères*/
/* la valeur retournée par la fonction printf n'est pas exploitée ici */
for (c=` `;c!=`p`; ) /* Pour (c étant initialement avec la valeur ` ` (espace);jusqu'à ce que c soit différent de la valeur `p`; pas d'opération particulière à chaque itération*/
{/* accolade de début du bloc d'instructions du "for"*/
c=getc(stdin); /* appel de la fonction "getc" avec comme argument "stdin"; la valeur retournée est mise dans la variable c*/
putc(c,stdout); /*appel de la fonction "putc" avec comme arguments "c" et "stdout"; la valeur retournée n'est pas exploitée*/
}/* accolade de fin du bloc d'instructions du "for" */
printf(" /n au revoir /n");
return 0;/* positionnement de la valeur 0 à retourner par la fonction principale ; cette valeur pourra être testée par le programme (le plus souvent l'interpréteur de commande qui a lancé l'exécution de ce programme*/
}/* accolade de fin de fonction principale */
Un processus est un "programme en train de s'exécuter". C'est le système d'exploitation qui contrôle cette exécution. Chaque processus est identifié par le système d'exploitation par un Identificateur de Processus (Pid). Chaque processus est caractérisé par les zones mémoires qu'il occupe pour ses données, son code et son descripteur, par des droits, par des flux d'entrée-sortie ouverts pour lui. Par défaut, tout processus se voit attribuer 3 flux d'entrée-sortie standard (stdin, stdout et stderr).
Il faut voir les entrées-sorties standard comme des "flux" d'octets qui sont disponibles en entrée ou en sortie du processus. En entrée ces flux sont alimentés par un périphérique ou un fichier ou un flux de sortie d'un autre processus. En sortie, le flux est traité par un périphérique ou dirigé vers un fichier ou vers un flux d'entrée d'un autre processus (voir illustration en figure 3)
Un programme en train de s'exécuter utilise essentiellement 2 segments mémoires : un segment de mémoire pour les données et un segment de mémoire pour le code exécutable.
Toute référence à une donnée est faite de manière relative au début du segment de donnée.
Le segment de donnée alloue la mémoire selon deux techniques : la "pile" et le "tas".
Figure 1 : les flux d'entrée-sortie standard d'un processus
Figure 2 : exemple d'enchaînement de flux entre processus (notion de redirection de flux)
Figure 3 : l'allocation d'un segment de mémoire ; notion de pile et de tas.
Il faut voir les entrées-sorties standard comme des "flux" d'octets qui sont disponibles en entrée ou en sortie du processus. En entrée ces flux sont alimentés par un périphérique ou un fichier ou un flux de sortie d'un autre processus. En sortie, le flux est traité par un périphérique ou dirigé vers un fichier ou vers un flux d'entrée d'un autre processus.