[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[un peu HS] argc, argv et exec*()



	Bonjour à tous,

	Pardonnez-moi le hors sujet léger. Je tombe sur un problème que je ne
comprends pas tout à fait.

	J'essaie de lire un fichier XML trivial (mais long) à coup de awk avant
de passer le résultat dans une moulinette (en C, mais là n'est pas la
question) pour trier les différentes données.

	En ligne de commande, je commence à traiter mon fichier XML comme ceci :

awk 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; }
/<\/comp>/ { I=I-1; }' alimentations_haute_tension.xml

et ça fonctionne parfaitement. J'extrais tous les blocs <comp
ref=xxx>...</comp>, même les blocs récursifs. Je n'ai pas besoin de plus
pour l'instant.

	Comme le traitement doit être automatique, j'ai donc collé cela dans un
programme en C avec un execvp(). Extrait :

...
            {
for(i = 0; i <= nombre_arguments; i++)
    printf("%d: %s\n", i, arguments[i]);

                execvp(arguments[0], arguments);
            }
...

	Je vous fais grâce de ce qui est avant et après ce traitement, en
particulier la grouille avec fork() et j'en passe.

	Sur la console, j'obtiens bien :
0: awk
1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; }
/<\/comp>/ { I=I-1; }'
2: alimentations_haute_tension.xml
3: (null)

	Donc argc[0] vaut awk, argc[1] vaut bien le contenu du script awk et
argc[2] le nom du xml à analyser.

	Résultat :

"awk: ligne de commande:1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } {
if (I>0) print; } /<\/comp>/ { I=I-1; }'"

	Et là, je ne comprends plus, d'autant que si je copie simplement les
trois valeurs dans un shell, ça fonctionne. Je suis preneur de toute
lumière.

	Bien cordialement,

	JKB


Reply to: