Dans Windows API pour créer un processus, nous avons la fonction CreateProcess
.
Considérons maintenant que nous voulons créer un processus et exécuter la commande DIR /X
Bien sûr, dans Windows, il n’y a pas d’exécutable DIR.exe
et nous ne pouvons pas simplement le transmettre à CreateProcess
. Alors que faire?
La solution de ce problème est assez simple. Nous devons juste passer cmd /C "DIR /X"
(comme second argument) à CreateProcess
.
Maintenant, essayons de faire la même chose (pas avec DIR /X
, mais avec ls | wc
) dans unix.
Dans unix, je vais utiliser fork + execvp
pour créer un nouveau processus et exécuter la commande. Pourquoi je veux que ma commande soit ls | wc
ls | wc
, car dans unix des commandes simples comme ls
, grep
, ps
sont des exécutables et peuvent être passées à exec uniquement (c.-à-d. pas comme argument de sh
, bash
, …).
Donc, là encore, il semble que l’on puisse passer "ls | wc"
comme argument de sh
. (c.-à-d. on peut token sh -c "ls | wc"
et les passer à execvp
). Mais Oooops, ça ne marche pas!
char *arg[] = {"sh", "-c", "\"ls | wc\"", NULL}; execvp(arg[0], arg);
Alors question Comment puis-je résoudre ce problème?
PS Dans windows si cygwin est installé cmd /C "ls | wc"
fonctionne.
Débarrassez-vous des guillemets sur l’argument de sh:
char *arg[] = {"sh", "-c", "ls | wc", NULL}; execvp(arg[0], arg);
Votre liste d’arguments doit être terminée par un pointeur NULL.
char *arg[] = {"sh", "-c", "ls | wc", NULL};
Vous n’avez pas besoin de l’évasion \"
, cela devrait fonctionner très bien:
char *arg[] = {"sh", "-c", "ls | wc", NULL};
Les "
sont simplement pour le shell pour distinguer quelle partie de l’entrée à” grouper “dans un argument, mais vous n’en avez pas besoin lors de votre appel execvp
. L’effet de votre pourrait être comme si vous avez entré "ls | wc"
"ls | wc"
dans votre shell, y compris les guillemets (essayez-le, vous obtiendrez ls | wc: command not found
).
Il serait probablement plus facile d’utiliser system () dans votre exemple.