Bonsoir,
Je voulais en savoir plus sur la commande sync, j'ai donc téléchargé le paquet coreutils contenant le .c qui va bien, et je dois avouer que j'ai rarement vu aussi minimaliste (à part un helloworld) ; quand j'enlève tout ce qui concerne le parsing des options (ça tombe bien, sync n'a pas d'options) et l'internationalisation (inutile pour ce que je veux voir), il ne reste quasiment rien, et pourtant, si je poste ici, c'est que quelque chose m'échappe :
Je ne mets pas le code de la proc void usage ni les include pour alléger.
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 /* The official name of this program (e.g., no `g' prefix). */ #define PROGRAM_NAME "sync" int main (int argc, char **argv) { /* c'est moi qui mets en commentaire tout ce bloc initialize_main (&argc, &argv); set_program_name (argv[0]); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); atexit (close_stdout); parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, Version, usage, AUTHORS, (char const *) NULL); if (getopt_long (argc, argv, "", NULL, NULL) != -1) usage (EXIT_FAILURE); if (optind < argc) error (0, 0, _("ignoring all arguments")); */ sync (); exit (EXIT_SUCCESS); }
Et quand je regarde les deux lignes du main, surtout la 1re, deux questions me viennent à l'esprit :
1- "sync ()" ça appelle... sync ? Pour appeler un prog depuis du C, c'est pas avec "system" ou la famille des "execv./execl." ?
2- en admettant qu'on puisse l'appeler comme ça, on part pas dans une boucle folle et sans fin, là ?
Un truc m'échappe vraiment, et pour essayer d'y voir clair j'ai dérivé de ce truc un prog essai.c :
mais en fait, ça ne compile pas : gcc -o essai essai.c --> undefined reference to 'essai'.
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <stdlib.h> #include <stdio.h> /* The official name of this program (e.g., no `g' prefix). */ #define PROGRAM_NAME "essai" int main (int argc, char **argv) { essai (); exit (0); }
À partir de là je me sens un peu coincé et je viens chercher vos lumières !
Ah, un dernier mot : j'ai utilisé locate pour voir les sync de ma machine (Debian 7 / 32 bits / Lxde), j'en ai trouvé 2, ça donne ça :
Pas bien utile pour le moment, mais je le mets quand même, sait-on jamais.
Code text : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 /bin/sync /usr/lib/klibc/bin/sync # ls -Al /bin/sync -rwxr-xr-x 1 root root 26152 janv. 26 2013 /bin/sync # ls -Al /usr/lib/klibc/bin/sync -rwxr-xr-x 1 root root 532 nov. 12 2012 /usr/lib/klibc/bin/sync # file /bin/sync /bin/sync: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x4d3c9dbd682f2cacf7f2d71f2b61b7595156286f, stripped # file /usr/lib/klibc/bin/sync /usr/lib/klibc/bin/sync: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked (uses shared libs), stripped
Partager