Это приблизительный скелет, основанный на коде уровня пользователя, а не на модуле ядра.< /p>
Код: Выделить всё
/* various includes */
void main() {
// stuff that requires sudo perms
fd = open("/dev/manager", O_WRONLY);
/* setup signal_handler() to handle signal from fd [omitted] */
close(fd);
}
void signal_handler(int signo) {
// None of this needs to be run with sudo privilege, and malfunctions if so
setgid(1000); setuid(1000); // see https://stackoverflow.com/questions/3357737/dropping-root-privileges
setenv("HOME", "/home/raspi", 1); // aplay uses $HOME, which was /root and inaccessible
/* generate output.wav [omitted] */
system("aplay /path/to/file/output.wav");
}
Код: Выделить всё
#include
#include
#include
void main() {
setgid(1000);
setuid(1000);
setenv("HOME", "/home/raspi", 1);
system("aplay /path/to/file/output.wav");
}
Вопросы по теме:
[1] Удаление root-прав — это почти ответ на мой вопрос. Это должно ответить на мой вопрос. Когда я попробовал, это просто не сработало.
[2] Проблемы с разрешением sudo в программе на языке C — я знаю, что здесь требует sudo, а что нет. Что мне неясно, так это то, как переключаться с одного на другое во время выполнения.
Подробнее здесь: https://stackoverflow.com/questions/783 ... at-runtime
Мобильная версия