По соглашению первым аргументом, передаваемым программе, является имя исполняемого файла. Однако это не обязательно должно быть.
В качестве примера возьмем следующую программу:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
printf("number of arguments: %d\n", argc);
printf("program name: %s\n", argv[0]);
for (i=1; i<argc; i++) {
printf("arg %d: %s\n", argv[i]);
}
return 0;
}
Если вы запустите эту программу из другой, вот так:
char*argv[] = {"myprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);
Выше будет вывод:
number of arguments: 3
program name: myprog
arg 1: A
arg 2: B
Но вы также можете запустить его так
char*argv[] = {"myotherprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);
И он выведет:
number of arguments: 3
program name: myotherprog
arg 1: A
arg 2: B
Вы можете использовать значение argv[0]
как способ узнать, как была вызвана ваша программа, и, возможно, предоставить различные функции на основе этого.
Популярный инструмент busybox делает именно это. Один исполняемый файл связан с разными именами файлов. В зависимости от того, какую ссылку пользователь использовал для запуска исполняемого файла, он может прочитать argv[0]
, чтобы узнать, был ли он вызван как ls
, ps
, pwd
и т. д.
person
dbush
schedule
25.11.2019