从内核模块,我试图使用call_usermodehelper函数来执行一个可执行文件sha1,它以文件作为参数,并将文件的SHA1哈希值写入另一个文件(命名输出)。可执行文件完美无缺。
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才能正确使用它。如何防止这种情况?
无论如何在没有call_usermodehelper的情况下执行此操作?
答案 0 :(得分:4)
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 */
如您所见,在wait = 1时,函数会在执行exec时等待,但不会等待该过程。
如果没有其他约束,值 UMH_WAIT_PROC 会提供更稳定的结果。