INTRODUCTION A LA PROGRAMMATION SOUS UNIX/LINUX (by coder) Pourquoi faire des articles sur la programmation sous Unix ? Tout simplement parceque la plupart des jeunes hackers sous Unix ne connaissent quasiment rien a Unix en verite (bon j'exagere un peu la mais...). Ils se contentent en general d'utiliser des outils, tout cela sans rien comprendre a leur fonctionement (si vous ne me croyez pas allez faire un tour sur channel de hack sur IRC et vous verez tout d'abord le nombre de lamerz et le nombre de gens qui utilisent des trucs tout faits (les exploits par exemple) sans rien n'y comprendre, c'est hallucinant). J'ai donc decide de realiser une serie d'articles dediee a la programmation sous Unix/Linux afin de fournir aux "newbies" les bases de la programmation sous unix/linux, afin qu'ils puissent peut-etre un jour creer leurs propres outils sans avoir besoin de tout repomper, ou tout simplement qu'ils puissent comprendre le fonctionement de tous ces outils et de leur systeme favori. Biensur, il faut deja savoir programmer un peu en C ce qui est le langage le plus utilise dans le monde Unix (tout simplement car la plupart des routines systeme sont ecrites en C). Au menu, vous aurez droit à : I : LES GENERALITES II : LES PROCESSUS III : LES ENTREES-SORTIES IV : LES TUBES V : LES TERMINAUX VI : LES SOCKETS VII : PROGRAMMATION SOUS X-WINDOW VIII : ASSEMBLEUR DE BASE SUR PLATEFORMES INTEL IX : LE NOYAU ET LES MODULES SOUS LINUX X : MULTIMEDIA SOUS LINUX (quesque ca fait la ca ??) Pour OrgaNiks#1, ya que le I je suis desole (pour des raisons eh... trop long a expliquer), pour le #2 yaura II, III et IV et pis le reste je sais pas. PARTIE I : LES GENERALITES Lorsque vous faites un programme sous unix, le compilateur realise l'edition de liens avec le module crt0.o contenant la fonction start dont la premiere instruction sera le point d'entree du programme binaire fraichement compile. C'est justement dans le corps de cette fonction qu'est realise l'appel a la fonction principale du programme, a savoir la fonction main, dont la forme la plus courante correspond au prototype suivant : int main(int argc, char *argv[], char **arge); Mais a quoi peuvent bien correspondre tout ces parametres ? - argc est le nombre de parametres passes au programme binaire - argv est un tableau constitue de argc pointeurs (plus un NULL pour marquer la fin du tableau), correspondant aux parametres passes au programme binaire - arge est une liste de pointeurs permettant d'acceder a l'environement du processus Exemple : en executant /bin/ls / nous obtenons : argc = 2 argv correspond a : "/bin/ls" "/" arge contiendra une copie de l'environement. Pour recuperer les variables d'environement, il faut utiliser : #include char *getenv(const char *variable); La liste des variables les plus courantes : "HOME" "PATH" "EDITOR" "TERM" "LOGNAME"... Vous pouvez bien entendu utiliser des variables de votre creation. Il aussi utile de modifier l'environement du processus : #include int putenv(const char *chaine); La chaine de caracteres donnee est sous la forme var=valeur (par ex: "EDITOR=emacs") Pour terminer un processus, il faut utiliser : #include void exit(int code_de_retour); ce qui pour effet de provoquer la termninaison du procesus avec le code de retour code_de_retour. Le fichier contient les macro-definitions des valeurs possibles (par exemple EXIT_SUCCESS = 0). Cet appel est la methode la plus sure pour terminer un processus puisqu'il libere les ressources allouees au processus et en particulier la fermeture des fichiers ouverts au niveau de la bibliotheque standard. Note : il existe egalement int atexit(void (*fonction)(void)); et void _exit(int valeur); Pour plus de renseignements allez faire un tour dans les manpages. Faites attentions a ne pas utiliser return a la place d'une des fonctions ci-dessus puisqu'un return depile seulement un niveau sur la pile d'execution, se qui fait qu'il n'y a aucun retour assure au module de lancement. Derniere petite fonction a connaite absolument : #include int system(const char *commande); Cette fonction a pour effet de demander l'execution d'une commande shell. Attention cette fonction est tres gourmande en temps d'execution puisqu'elle necessite la creation d'un processus shell qui interpretera la commande demandee. -----------------------DIVERS---------------------- Voila un ptit File qui vous est destine : Je desire dire aux jeunes lecteurs de ce mag et des autres mag d'arreter le scanning de 0800 chez eux... Au cas ou vous ne le sauriez pas, FT ecoute beaucouo plus vos communications en 0800 qu'il y a quelques annees. Alors gare au BUST ! Scannez plutot dans des cabines telephoniques c'est vraiment conseille! Sinon, j'ai un petit sondage a vous faire participier concernant la presentation de ce mag... Aimez-vous la presentation de ce mag en ASCII ? Preferiez-vous une presentation en RTF ? CA vous dirait une presentation en LaTeX ? En postscript bien soigne, comme un bookin ?? Ce mag vous a til plus ? Comment le qualifiez vous ? Bien, pas bien, merde absolue, genial, bof ca va... ? Voila c'est tout.... huh Et pis n'hesitez pas a ecrire un ptit article, meme si ca concerne pas le h/p/c... Repondez moi a dacoder@altern.org