programmation_c_gcc
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteDernière révisionLes deux révisions suivantes | ||
programmation_c_gcc [2009/06/05 11:05] – thierry | programmation_c_gcc [2010/05/25 15:04] – thierry | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | |||
+ | ====== debug ====== | ||
+ | ===== memory leak ===== | ||
+ | |||
+ | ==== cas 1 ==== | ||
+ | |||
+ | Essayer: **'' | ||
+ | |||
+ | Lien: http:// | ||
+ | |||
+ | ==== cas 2 ==== | ||
+ | Lien: http:// | ||
+ | |||
+ | Essayer " | ||
+ | |||
+ | $ man mtrace | ||
+ | |||
+ | #include < | ||
+ | | ||
+ | void foo( void ) | ||
+ | { | ||
+ | // FIXME | ||
+ | // lot of malloc/ | ||
+ | } | ||
+ | | ||
+ | void int main( void ) | ||
+ | { | ||
+ | setenv(" | ||
+ | | ||
+ | mtrace(); | ||
+ | | ||
+ | foo(); | ||
+ | } | ||
+ | |||
+ | $ gcc -g -o foo foo.c | ||
+ | | ||
+ | ./foo | ||
+ | | ||
+ | $ mtrace foo / | ||
+ | |||
+ | ===== backtrace ===== | ||
+ | Lien: http:// | ||
+ | |||
+ | ====== Divers ====== | ||
+ | ===== flock ===== | ||
+ | Accès partagé, coopératif, | ||
+ | |||
+ | ==== logs ==== | ||
+ | Pour écrire en fin de fichier (des logs par exemple) | ||
+ | |||
+ | Soit un fichier de log ouvert comme cela: | ||
+ | |||
+ | if ( -1 == (fd=open(filename, | ||
+ | perror(" | ||
+ | } | ||
+ | else { | ||
+ | // ... suite plus bas... | ||
+ | } | ||
+ | |||
+ | Donc: | ||
+ | | fd | descripteur du fichier ouvert en ecriture seule | | ||
+ | |||
+ | On bloque ainsi, à partir de la fin du fichier: | ||
+ | // bloquer l' | ||
+ | struct flock lock; | ||
+ | | ||
+ | memset( & | ||
+ | | ||
+ | lock.l_type = F_WRLCK; | ||
+ | lock.l_whence = SEEK_END; | ||
+ | lock.l_start = 0; | ||
+ | lock.l_len = 0; | ||
+ | | ||
+ | if ( -1==fcntl(fd, | ||
+ | else { | ||
+ | // ... suite plus bas... | ||
+ | } | ||
+ | Voila, c'est bloqué, à partir de la fin du fichier (connu a cette instant) et au dela. | ||
+ | |||
+ | On imagine qu'on se positionne a la fin du fichier et qu'on ecrit dedans... | ||
+ | |||
+ | Pour retirer le verrou... il faut debloquer __tout__ le fichier ! | ||
+ | memset( & | ||
+ | | ||
+ | lock.l_type = F_UNLCK; | ||
+ | lock.l_whence = SEEK_SET; | ||
+ | lock.l_start = 0; | ||
+ | lock.l_len = 0; | ||
+ | | ||
+ | if ( -1==fcntl(fd, | ||
+ | |||
+ | J'ai calé quelques instants sur cette " | ||
+ | |||
+ | D' | ||
+ | |||
+ | ===== uuid ===== | ||
+ | Creer des identifiants unique de sessions... | ||
+ | |||
+ | Installer les " | ||
+ | # aptitude install uuid-dev | ||
+ | |||
+ | Composer **'' | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | | ||
+ | int main( int argc, char *argv[] ) | ||
+ | { | ||
+ | uuid_t myid; | ||
+ | char buf[36+1]; | ||
+ | | ||
+ | // generer uuid (16 chars) | ||
+ | uuid_generate(myid); | ||
+ | | ||
+ | // le rendre human readable | ||
+ | uuid_unparse(myid, | ||
+ | | ||
+ | printf(" | ||
+ | | ||
+ | return EXIT_SUCCESS; | ||
+ | } | ||
+ | |||
+ | Compiler: | ||
+ | $ gcc -o uuid uuid_test.c -luuid | ||
+ | |||
+ | Executer: | ||
+ | $ ./uuid | ||
+ | uuid=33045d19-1469-4c2b-a151-a7b927621af4 | ||
+ | |||
+ | Existe aussi en ligne de commande: | ||
+ | $ uuidgen | ||
+ | a0fdf4f1-9fb5-4c0e-8f23-f330b3af65fc | ||
====== utf8 ====== | ====== utf8 ====== | ||
Ligne 266: | Ligne 400: | ||
Voila. | Voila. | ||
+ | |||
+ | ==== DOS ==== | ||
+ | |||
+ | Lien: http:// | ||
+ | |||
+ | |||
+ | La conversion d'un fichier DOS vers Linux peut fonctionner comme cela: | ||
+ | $ iconv -f CP437 old-minitel-powa.h > | ||
+ | |||
+ | Conversion par lot: | ||
+ | $ cd dosfile | ||
+ | $ find * -exec iconv -f CP437 {} -o ../{} \; | ||
===== En perl ===== | ===== En perl ===== | ||
Ligne 271: | Ligne 417: | ||
Lien: http:// | Lien: http:// | ||
+ | ==== base ==== | ||
Par defaut, le compilateur Perl ignore (volontairement pour des questions de compatibilité ascendante) l' | Par defaut, le compilateur Perl ignore (volontairement pour des questions de compatibilité ascendante) l' | ||
Ligne 307: | Ligne 454: | ||
2 solutions: | 2 solutions: | ||
Soit: Il faut utiliser l' | Soit: Il faut utiliser l' | ||
- | $ perl -C hello.pl | + | $ perl -C utfhello.pl |
Soit: Il faut ajouter la ligne suivante (au début du scripte): | Soit: Il faut ajouter la ligne suivante (au début du scripte): | ||
binmode(STDOUT, | binmode(STDOUT, | ||
Ligne 314: | Ligne 461: | ||
$ ./ | $ ./ | ||
Voilà le mot: Vidéo dont la longueur est 5 | Voilà le mot: Vidéo dont la longueur est 5 | ||
+ | |||
+ | De même, lorsqu' | ||
+ | # en lecture | ||
+ | open( my $f , '<: | ||
+ | # en ecriture | ||
+ | open( my $f , '>: | ||
+ | et pour un fichier déjà ouvert: | ||
+ | binmode( $handle , ": | ||
+ | |||
+ | ==== encode ==== | ||
+ | Exemple pour jongler entre " | ||
+ | my $m = " | ||
+ | | ||
+ | utf8:: | ||
+ | | ||
+ | print " | ||
+ | | ||
+ | utf8:: | ||
+ | | ||
+ | print " | ||
+ | |||
+ | Sortie écran: | ||
+ | Aprés encode: Vidéo de longueur 6 | ||
+ | Aprés decode: Vidéo de longueur 5 | ||
programmation_c_gcc.txt · Dernière modification : 2010/07/13 16:16 de thierry