Если вы хотите предоставить аргументы через argv[]
(как вы указали в своих комментариях), это упрощает переход к execv
, если вы предоставляете Full-Path для программа для запуска в качестве первого аргумента и любой аргумент для передачи этой программе после этого. argv
- это уже массив указателей с первым указателем после последнего предоставленного пользователем аргумента, установленного на NULL
. Вы просто начинаете индексирование с argv[1]
(argv[0]
- это всегда текущая программа, запускаемая, argv[1]
первый предоставленный пользователем аргумент). Вы можете сделать что-то простое:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "error: insufficient input.\n"
"usage: %s full-path-prog [arg1, arg2, ...]\n", argv[0]);
return 1;
}
execv (argv[1], &argv[1]); /* call execv with argv[] */
}
( примечание: в случае успеха, execv
не возвращается, новый процесс заменяет текущий, в случае неудачи вы должны на самом деле вызвать _exit();
, чтобы избежать UB в угловом случае, если вы установили atexit()
функции или деструкторы - здесь не имеет значения)
Пока вы предоставляете правильное имя утилиты и аргументы (не включая перенаправления и т. д. c ..), код просто передает утилиту в execv
и будет выполняться с любыми предоставленными дополнительными аргументами, например,
Пример использования / Вывод
Предоставление полного пути к программе и любых аргументов, например
$ ./bin/execv_simple /bin/ls -al /home/david/tmp
total 1163032
drwxr-xr-x 44 david david 20480 Mar 23 13:35 .
drwxr-xr-x 68 david david 4096 Mar 25 02:36 ..
drwxr-xr-x 2 david david 4096 Nov 7 22:30 .qt
-rw-r--r-- 1 david david 4534793 Nov 4 19:31 .xsession-errors
...
$ ./bin/execv_simple /usr/bin/df -h
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 4043708 0 4043708 0% /dev
tmpfs 4055092 11964 4043128 1% /dev/shm
tmpfs 4055092 1716 4053376 1% /run
tmpfs 4055092 0 4055092 0% /sys/fs/cgroup
/dev/sdb2 41156156 25400864 13641604 66% /
tmpfs 4055092 60 4055032 1% /tmp
/dev/sdb3 437217592 43731284 392581260 11% /home
tmpfs 811016 8 811008 1% /run/user/1000
$ ./bin/execv_simple /usr/bin/free
total used free shared buff/cache available
Mem: 8110188 2147572 4048728 53432 1913888 5594460
Swap: 2103292 0 2103292
( примечание: вы можете использовать подстановку команд с type -p
или which
для предоставления полного имени программы, например, ./bin/execv_simple $(type -p free)
будет заполнять полный путь информации для вас)
Аргументы не предоставлены: * 103 9 *
$ ./bin/execv_simple
error: insufficient input.
usage: ./bin/execv_simple full-path-prog [arg1, arg2, ...]
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.