Pourquoi le même fonctionne pour Windows et ne fonctionne pas pour unix?

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.