Я не совсем уверен, почему вы даже используете семейство exec
для запуска внешних программ в этом случае.Стандартная библиотека C предоставляет идеально адекватных файловых устройств ввода / вывода.
Например, вы можете просто fopen
, fprintf
и fclose
файл без когда-либо запускать другой внешний процесс, который будет выполнять эту работу за вас:
int bytesWrit = 0;
FILE *gpioHndl = fopen("/sys/class/gpio/gpio67/value");
if (gpioHndl != NULL) {
bytesWrit = fprintf(gpioHndl, "1\n");
fclose(gpioHndl);
}
if (bytesWrit != 2) {
HandleError();
}
Вероятно, это предпочтительный способ сделать то, что вы хотите, - просто записать фиксированное значение в файл.
С точки зрения того, почему ваш execv
звонок не работает (хотя это совершенно неважно, если вы примите мой совет выше), есть несколько вещей, о которых вам нужно знать.
Во-первых,в то время как некоторые команды на самом деле являются файлами на диске, которые вы можете exec
, другие могут быть внутренними bash
командами (a) .В моей системе, например:
pax:~$ type ftp
ftp is /usr/bin/ftp
pax:~$ type echo
echo is a shell builtin
Один из способов решить эту проблему - запустить фактический исполняемый файл bash
(который, будучи командой на диске, может быть выполнен черезexec
), указав ему выполнить внутреннюю команду echo
.Из командной строки:
pax:~$ bash -c 'echo xyzzy'
xyzzy
Во-вторых, если вы хотите использовать перенаправление, это обычно то, что делается с помощью оболочки , , а не вызовов exec
или отдельных исполняемых файлов.
Попытка выполнить перенаправление через семейство exec
обычно приводит только к тому, что >somefile
передается в качестве параметра literal в исполняемый файл (в массиве argv
), не используется для прикрепления стандартного вывода к файлу.Другими словами, он не будет работать, если исполняемый файл специально не обрабатывает перенаправление, что редко.
Это означает, что вам придется запускать оболочку с перенаправлением и запускать исполняемый файл после выполнения этих перенаправлений, даже если команда не является внутренней.
В-третьих, если вы хотите, чтобы путь, по которому выполняется поиск вашего исполняемого файла, execvp
- это требуемый вызов, а не execv
(последняя простоиспользует файл, который вы явно предоставили, либо относительно текущего рабочего каталога, либо по абсолютному пути, например /bin/ls
).Итак, в вашем случае вы должны:
- использовать
execvp
для поиска пути;или - полностью укажите путь с помощью
execv
.
(a) Команда echo
, пока она bash
-Внутренний также может быть предоставлен как отдельный исполняемый файл (я полагаю, что Posix требует этого), так что это может не быть проблемой здесь.Это может быть проблемой, если вы ожидаете, что они будут действовать точно так же с точки зрения более эзотерических аргументов: -)