Почему то же самое работает для Windows и не работает для Unix? - PullRequest
2 голосов
/ 21 апреля 2011

В Windows API для создания процесса у нас есть CreateProcess функция.

Теперь давайте рассмотрим, что мы хотим создать процесс и запустить команду DIR /X. Конечно, в Windows нет исполняемого файла DIR.exe, и мы не можем просто передать его в CreateProcess. Так что же делать?

Решение этой проблемы довольно просто. Мы просто должны передать cmd /C "DIR /X" (в качестве второго аргумента) CreateProcess.

Теперь давайте попробуем сделать то же самое (не с DIR /X, а с ls | wc) в unix.

В Unix я собираюсь использовать fork + execvp для создания нового процесса и выполнения команды. Почему я хочу, чтобы моя команда была ls | wc, потому что в Unix отдельные команды, такие как ls, grep, ps, являются исполняемыми файлами и могут быть переданы только в exec (т.е. не в качестве аргумента sh, bash , ...).

Итак, здесь снова кажется, что мы можем передать "ls | wc" в качестве аргумента sh. (то есть мы можем токенизировать sh -c "ls | wc" и передать их execvp). Но ооо, это не работает!

char *arg[] = {"sh", "-c", "\"ls | wc\"", NULL};
execvp(arg[0], arg);

Итак, вопрос. Как я могу решить эту проблему?

P.S. В windows если установлен cygwin cmd /C "ls | wc" работает.

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

Ваш список аргументов должен заканчиваться нулевым указателем.

char *arg[] = {"sh", "-c", "ls | wc", NULL};
2 голосов
/ 22 апреля 2011

Возможно, в вашем примере было бы проще использовать system ().

2 голосов
/ 21 апреля 2011

Вам не нужны экранированные \", это должно работать просто отлично:

char *arg[] = {"sh", "-c", "ls | wc", NULL};

" просто для оболочки, чтобы отличить, какая часть ввода "group" в аргумент, но они вам не нужны при выполнении вызова execvp. Эффект вашей команды мог бы быть таким, как если бы вы ввели "ls | wc" в свою оболочку, включая двойные кавычки (попробуйте, вы получите ls | wc: command not found).

1 голос
/ 21 апреля 2011

Избавьтесь от кавычек по аргументу sh:

char *arg[] = {"sh", "-c", "ls | wc", NULL};
execvp(arg[0], arg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...