меньше: отсутствует имя файла с помощью execvp () - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь использовать execvp () для запуска меньше, но я продолжаю сталкиваться с той же ошибкой, говоря, что:

Missing filename ("less --help" for help)

Я предполагаю, что я пытаюсь ввести файл совершенно неправильно.Может ли кто-нибудь дать мне руководство?Вот моя строка кода, пытающаяся это реализовать:

// args[0] == "tempFile" which is in my directory
execvp("less", args)

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

argv[0] - это имя, которое вы даете команде.Команда, которую вы выполняете, использует это, чтобы знать, как она была вызвана.Как правило, вы хотите использовать что-то вроде less здесь:

argv[0] = "less";
argv[1] = "filename";
argv[2] = NULL;
execvp("less", argv);
0 голосов
/ 23 октября 2018

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

Аргумент 1 из argv[1] - это первый «реальный» аргумент.Поэтому передайте трехэлементный массив, содержащий: char *args[] = {"less", "tempFile", NULL}

В большинстве языков используется одинаковая нумерация аргументов.Например, если вы вызываете скрипт оболочки, он видит то, что вы передаете как argv[0], как его $0, что вы передаете как argv[1] как $1 и т. Д. Perl является заметным исключением: в скрипте Perl,argv[0] - $0, argv[1] - $ARGV[0], argv[2] - $ARGV[1] и т. Д.

0 голосов
/ 23 октября 2018

Так же, как когда вы запускаете сценарий оболочки в командной строке с

sh -c 'script body here' arg0 arg1 arg2

, аргумент arg0 помещается в $0 (обычно это имя процесса) и не является на самом делесчитается одним из аргументов командной строки самого скрипта (он не является частью $@ и $# не будет его считать).Первый аргумент командной строки, доступный в $1: arg1.

В вашем случае используйте args[0] = "less" и args[1] = "tempFile" в вашем C-коде.args[3] должен быть нулевым указателем.

...