В 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"
работает.