Вызов команды "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

Другие вопросы по тегам