проблема генерации argv для spawnvp () - PullRequest
2 голосов
/ 07 мая 2011

Мне нужно запустить команду, используя spawnvp () , чтобы я мог перенаправить вывод. Моя проблема в том, что у меня нет argv, а просто строка со всем commnd, поэтому мне нужно разделить ее. К сожалению, я получил исключение, когда передал свой сгенерированный argv в функцию.

Работает так:

char* argv[2];
argv[0] = "kzip";
argv[1] = NULL;

Вот как я это делаю, что не получается:

char** argv2 = (char**)malloc(sizeof(char*) * 2);
argv2[0] = "kzip";
argv2[1] = NULL;

Вот как я называю spawnvp () :

hProcess = (HANDLE)spawnvp(P_NOWAIT, argv2[0], (const char* const*)&argv2);

Я знаю, что есть некоторая разница между char [] и char *, но я не могу понять, как создать динамически созданный char * [] вместо char **.

Ответы [ 4 ]

3 голосов
/ 07 мая 2011

Я не положу руку в огонь, но вы должны сбросить & с этой линии.

hProcess = (HANDLE)spawnvp(P_NOWAIT, argv2[0], (const char* const*)&argv2);

argv == &argv, но argv2 != &argv2

1 голос
/ 07 мая 2011

Ваш последний аргумент для spawnvp неверен, он должен быть просто spawnvp(P_NOWAIT, argv2[0], argv2);, а не адресом вашего указателя.

0 голосов
/ 07 мая 2011

Если у вас есть командная строка в стиле оболочки, вы должны появиться с этим argv:

(char []){ "sh", "-c", command, 0 }
0 голосов
/ 07 мая 2011

Использование spawnxx () для перенаправления вывода не очень хорошая идея.Лучше использовать popen () и создать командную строку для соответствующего перенаправления, например, если вы хотите перенаправить stdout и stderr из command.exe в somefile.txt:

popen("command.exe &> somefile.txt")
...