Mode
Slides
Presentation
Remote control
Send
Listen
Press F11 to switch to fullscreen.
C: Cours 12
1
C
2
Exécution vs. développement
3
Mix
4
Fichiers
5
Redirection
6
Pipes
7
popen
8
Sérialisation
9
Réseau
10
Bibliothèques
11
Bibliothèques
12
Bibliothèques
13
Module Python
14
Semaine 12
Passer des données d'un
programme à un autre
SSIE Programmation en C, Thomas Lochmatter, 2019
1

Le langage C ...

... date de 1972, mais est toujours utilisé ...

... si la vitesse d'exécution est prioritaire.

développement exécution
Python rapide lent
Calcul scientifique, prototypage, ...
C lent rapide
Linux kernel, interpréteur Python, traitement d'images, ...

... sur des systèmes avec très peu de puissance de calcul et de mémoire.

SHT85
Capteurs numériques, microcontrolleurs, Arduino, ...
2

Temps d'exécution vs. temps de développement

C0.070 s Python2.600 s Perl4.200 s JavaScript¹(a) 0.086 s(b) 0.310 s Pythonavec module C0.070 s 35x plus lentsur les tableauxd'entiers 1. Démarrage: 0.510 s, implémentations avec Uint8Array (a) et Array (b) Crible d'Ératosthène, nombres premiers jusqu'à 10'000'000
Concaténation de chaines de caractères
		char fichier[1024];
		snprintf(fichier, 1024, "%s/%s", repertoire, nom);
	
3
projet.c projet Makefile executer-tout analyse.py curl https://... image.jpg ./projet ./executer-tout resultat image.h image.c ./analyse.py cron ... make, gcc image.jpg resultat 1 fois par heure fichiersintermédiaires écrit en C scriptPython Répertoire du projet outilinstallé shell script
4

Passer par des fichiers

curl https://... image.jpg ./projet fopen, fclose,fgets, fprintf, ...
	# Télécharger une image
	$$ curl 'https://...' -o image.jpg

	# Traitement
	$$ ./projet image.jpg
5

Redirection dans un fichier

./projet resultat printf stdout sort resultat-trie stdout stdin
	# Stocker la sortie dans le fichier "resultat"
	$$ ./projet image.jpg > resultat

	# Trier le résultat
	$$ sort < resultat > resultat-trie
6

Connecter la sortie d'un programme à un autre

./projet printf stdout sort resultat-trie stdout stdin
	# La sortie de "./projet" connecté à l'entrée de "sort"
	$$ ./projet image.jpg | sort > resultat-trie
Anonymous pipe et Pipeline sur Wikipedia
7

Exécuter un autre programme depuis le code C

	// HIDE
	#include <stdio.h>
	#include <stdlib.h>

	// SHOW
	// Lancer une commande
	int exitCode = system("curl 'https://...' -o image.jpg");

	// Ecrire dans STDIN d'un programme
	FILE * programme = popen("python analyse.py", "w");
	fprintf(programme, "Pixels bleus: %d\n", nbPixelsBleus);
	fprintf(programme, "Pixels noirs: %d\n", nbPixelsNoirs);
	pclose(programme);
Exit status sur Wikipedia, system("string") en Octave, os.system(...) ou subprocess.run(...) en Python
8

Sérialisation et désérialisation des données

./projet ./analyse.py resultat 13.6, 16.3, 17.0, ..., 12.6 Texte CSV sérialiser désérialiser Tableau de double Liste de valeurs décoder coder parse suite de bytes
Formats: CSV, JSON, PNG, JPEG, ...
Serialization sur Wikipedia
9

Passer d'un ordinateur à l'autre ...

./projet ./analyse.py resultat resultat rsync, http(s) ./projet ./analyse.py ssh stdout stdin

... ou stocker le résultat et continuer plus tard.

10

Inclure des bibliothèques

libexif ./projet
	// Inclure le fichier .h
	#include <libexif/exif-data.h>

	// Appeler les fonctions depuis le code
	ExifData * exifData = exif_data_new_from_file("image.jpg");
	...
	# Compiler avec la bibliothèque "libexif"
	$$ gcc ... -lexif ...
11

Créer une bibliothèque

projet.c projet.h image.c image.h Bibliothèquestandard C BibliothèquePNG Bibliothèquelibm stdio.h, ... png.h math.h projet.o image.o libc.so libpng.so libm.so libprojet.so Dépendences:libpng.so, libm.so et libc.so -shared -fPIC -fPIC
La bibliothèque peut contenir plusieurs fonctions, mais pas de fonction main.
12

Bibliothèque générée

Bibliothèquedu projet projet.h libprojet.so

projet.h

			int cielBleu(char * fichier);
			int imageNuit(char * fichier);
			int nombreDeVoitures(char * fichier);
		

libprojet.so

Depend de: libpng, libm, libc
Fournit: cielBleu, imageNuit, nombreDeVoitures, ...
Utilise: malloc, free, fopen, fclose, png_create_read, ...
Afficher le contenu de libprojet.so: nm -D libprojet.so, readelf -d -s libprojet.so, objdump -T libprojet.so
13

Module Python

libprojet.so python3 dlopen analyse.py PyInit_projet() Code C Code Python dict = {cielBleu: 0.89, nuit: 1} Structure d'un module Python Module "projet" méthode ... méthode traiterImage
		#include <Python.h>

		...

		PyObject * cb = PyFloat_FromDouble(...);
		PyObject * nuit = PyLong_FromLong(...);

		PyObject * dict = PyDict_New();
		PyDict_SetItemString(dict, "cielBleu", cb);
		PyDict_SetItemString(dict, "nuit", nuit);
	
Exemples: Python, Octave, Dynamic loading sur Wikipedia
14