1

Из модуля ядра я пытаюсь использовать функцию call_usermodehelper для выполнения исполняемого файла sha1, который принимает файл как аргумент и записывает хэш-сумму SHA1 файла в другой файл (с именем output). Исполняемый файл отлично работает.Почему call_usermodehelper терпит неудачу в большинстве случаев?

int result=-1; 
name = "/home/file" 
char *hargv[] = {"/home/sha1", name,NULL }; 
char *henvp[] = {"HOME=/", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }; 
result = call_usermodehelper("/home/sha1", hargv, henvp, 1); 

Но большую часть времени call_usermodehelper возвращает -14 и не выполняет исполняемый файл. Что может быть причиной?

Иногда он работает, но затем созданный выходной файл заблокирован (в отличие от того, что происходит, когда sha1 запускается напрямую), и я должен запустить chown, прежде чем я смогу использовать его правильно. Как это можно предотвратить?

Есть ли способ выполнить эту операцию без вызова_сервера?

ответ

2

Последний аргумент для call_usermodehelper на самом деле своего рода перечисления:

#define UMH_NO_WAIT  0  /* don't wait at all */ 
#define UMH_WAIT_EXEC 1  /* wait for the exec, but not the process */ 
#define UMH_WAIT_PROC 2  /* wait for the process to complete */ 
#define UMH_KILLABLE 4  /* wait for EXEC/PROC killable */ 

Как вы можете видеть, с ожиданием = 1 функция ждет, пока Exec выполняется, но не ждет процесс.

Если никаких других ограничений, значение UMH_WAIT_PROC дает более стабильные результаты.

+0

Кажется, что нужно работать после смены на 2. Спасибо. –