LINUX.ORG.RU

История изменений

Исправление debugger, (текущая версия) :

В винде передача аргументов в программу — врождённый дефект. Гугли описание функции CreateProcess — процессу предаётся одна командная строка, содержащая все аргументы, и каждая программа вольна разбираться с этой строкой как хочет. Может положиться на стандартную сишную библиотеку, а может и не полагаться — виндовые (в смысле «не консольные», те, у которых исполнение начинается с функции WinMain, а не main) программы так и делают.

В юникс-подобных системах с этим полегче, т. к. программе передаётся массив строк, каждый аргумент — отдельная строка (man 2 execve). В отличие от винды юниксовой программе нет нужды думать как разбивать строчку на отдельные параметры.

Однако, одна программа может запустить другую программу не непосредственно (через execve), а, скажем, при помощи функции system (man 3 system), которая принимает одну строку, и запускающая программа должна сформировать эту строку правильно, чтобы шелл эту строчку побил на отдельные аргументы так, как и было задумано. В принципе, поведение шелла (причём не какого-нибудь, а /bin/sh) документировано и даже стандартизовано, поэтому подготовить строку для него не так трудно. (Но «не так трудно» не значит, что можно каждый аргумент тупо заключать в кавычки, т. к. аргумент может содержать кавычки.) Дальше распространяться на эту тему мне лень.

Когда я говорил «универсального решения нет», это относилось к взаимодействию с не вполне корректными программами, которые собирают командную строку абы как, не парясь. Обсуждать здесь особо нечего, просто надо писать коррекный код и нормальную документацию на программы.

Исходная версия debugger, :

В винде передача аргументов в программу — врождённый дефект. Гугли описание функции CreateProcess — процессу предаётся одна командная строка, содержащая все параметры, и каждая программа вольна разбираться с этой строкой как хочет. Может положиться на стандартную сишную библиотеку, а может и не полагаться — множество виндовых (в смысле «не консольных», у которых исполнение начинается с функции WinMain, а не main) приложений так и делают.

В юникс-подобных системах с этим полегче, т. к. программе передаётся массив строк, каждый аргумент — отдельная строка (man 2 execve). В отличие от винды юниксовой программе нет нужды думать как разбивать строчку на отдельные параметры.

Однако, одна программа может запустить другую программу не непосредственно (через execve), а, скажем, при помощи функции system (man 3 system), которая принимает одну строку, и запускающая программа должна сформировать эту строку правильно, чтобы шелл эту строчку побил на отдельные аргументы так, как и было задумано. В принципе, поведение шелла (причём не какого-нибудь, а /bin/sh) документировано и даже стандартизовано, поэтому подготовить строку для него не так трудно. (Но «не так трудно» не значит, что можно каждый аргумент тупо заключать в кавычки.) Дальше распространяться на эту тему мне лень.

Когда я говорил «универсального решения нет», это относилось к взаимодействию с не вполне корректными программами, которые собирают командную строку абы как, не парясь. Обсуждать здесь особо нечего, просто надо писать коррекный код и нормальную документацию на программы.