Как избежать разделения пробелов и удаления кавычек с помощью _spawnvp () - PullRequest
3 голосов
/ 10 ноября 2010

В Unix мы можем создать новый процесс с помощью fork (); execvp (argv [0], argv); (с небольшой долей сантехники, работающей, если мы являемся родителем или ребенком, следующим за развилкой). В дочернем процессе main (argc, argv) будет видеть строки в точности так, как они были переданы в execvp.

В Windows семейство _spawn () в основном реализует fork (); Exec (); в один шаг. Пока все хорошо. Проблема в том, что к тому моменту, когда мы доходим до main () в дочернем элементе, наши строки уже не те, что были. Позвольте мне привести пример.

argv[0] = "foo";
argv[1] = "bar";
argv[2] = "Use spaces and \"quotes\"";
_spawnvp(0, argv[0], argv);

Когда мы дойдем до потомка, в main () мы обнаружим, что в этом примере argv [0] и argv [1] соответствуют ожиданиям, но argv [2] был размечен на пробелы, а кавычки удалены что

argv[2] == "Use"
argv[3] == "and"
argv[4] == "quotes"

Как я могу передать структуру argv от родителя к ребенку, как есть, с ее переосмыслением и изменением?

1 Ответ

2 голосов
/ 10 ноября 2010

Согласно примечанию к документации MSDN , если вы хотите, чтобы строка, содержащая пробелы, передавалась как один аргумент, вам нужно заключить ее в кавычки.

Пробелы, встроенные в строки, могут вызвать непредвиденное поведение; например, передача _spawn строки «hi there» приведет к тому, что новый процесс получит два аргумента: «hi» и «there». Если мы хотим, чтобы новый процесс открыл файл с именем «hi there», процесс завершился бы неудачей. Вы можете избежать этого, заключив строку в кавычки: "\" hi there \ "".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...