我在内核模块上工作,用来从内核空间用python写一个文件 首先尝试:我从内核编写运行python文件的代码:
int ret = -1;
char path[] = "/bin/bash";
char *argv[] = {path, "-c", "python", "/home/samba/getter.py",NULL};
char *envp[] = {"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL};
printk("call_usermodehelper module is starting..!\n");
ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);
printk("ret=%d\n", ret);
这是python代码:
# getter.py
import urllib2
import json
url = "http://172.16.189.1:8000/random/"
response = urllib2.urlopen(url)
input_file = open("/home/samba/something.txt", "w")
input_file.write(json.loads(response.read())["hash"])
input_file.close()
(上面的python脚本工作正常。当我从用户空间运行它时,它会创建something.txt
文件并成功保存输出。)
在模块上加载后,文件something.txt
无法创建,当我运行dmesg
命令时,我看到了这一点:
[16184.383282] call_usermodehelper module is starting..!
[16184.384389] ret=0
第二次尝试:我将python
命令更改为touch
但仍然无法创建文件,但呼叫触摸后的ret
值为非零!
int ret = -1;
char path[] = "/bin/bash";
char *argv[] = {path, "-c", "touch", "/home/samba/something.txt",NULL};
char *envp[] = {"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL};
printk("call_usermodehelper module is starting..!\n");
ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);
printk("ret=%d\n", ret);
当我在加载模块后运行dmeseg
命令时,我看到输出如下:
[16211.309975] call_usermodehelper module is starting..!
[16211.311053] ret=256
但未创建文件/home/samba/something.txt
。我做错了什么?
更新:感谢其中一个答案,通过将UMH_WAIT_PROC
更改为UMH_WAIT_EXEC
,touch
命令(第二种情况)现在可以正确创建文件,但是python代码仍然无效。
答案 0 :(得分:1)
这个设计首先看起来有缺陷。从内核中产生的东西应该只在非常特殊的情况下才能完成。一个明显不太糟糕的解决方案将使用常规用户空间进程等待例如netlink事件。不是用usermodehelper生成的,而是像典型的守护进程一样。