Вызов команды "ps" с аргументами с execl имеет неожиданное поведение
Я написал простую программу на C, которая использует функцию execl. После запуска этой программы я ожидаю увидеть вывод ps -U myusername
,
Если писать ps -U myusername
в терминале я получаю желаемый результат.
Если звонит execl("/bin/ps", "/bin/ps", "-U myusername", NULL)
Я получаю следующее сообщение об ошибке error: improper list
,
Однако, если я удаляю пространство из -U myusername
и вызовите функцию следующим образом: execl("/bin/ps", "/bin/ps", "-Umyusername", NULL)
Я получаю правильный результат.
Почему это происходит и как я могу достичь ожидаемого поведения (это всего лишь простой пример; на самом деле я хочу, чтобы пользователь ввел команду, разделил ее на команды и аргументы и, наконец, вызвал что-то вроде execlp("command", "command", "arguments", NULL)
.)?
1 ответ
Это переменная функция. Просто назовите это так:
execlp("command", "command", "first arg", "second arg" /*, etc*/, NULL);
или в вашем случае
execlp("/bin/ps", "/bin/ps", "-U", "username", NULL);
NULL
говорит функции: "все в порядке, аргументов больше нет". Если вы забудете об этом, поведение будет неопределенным.
Чтобы идти дальше: http://manpagesfr.free.fr/man/man3/stdarg.3.html
Линия execlp("/bin/ps", "/bin/ps", "-Uusername", NULL);
работает потому что ps -Uusername
такой же как ps -U username
, Просто введите его в консоли, он докажет вам этот факт;)
Линия execlp("/bin/ps", "/bin/ps", "-U username", NULL);
не работает, потому что, как будто вы печатаете ps '-U username'
в твоей раковине. '-U username'
это единственный аргумент, который не является допустимым аргументом ps