2002-09-02 15:55:28

by Der Herr Hofrat

[permalink] [raw]
Subject: kthread execve question


HI !

starting out at kernel/kmod.c as an example I tried to execve a simple command
from a kernel thread using the exec_usermodehelper from kmod (kmod enabled in
the kernel). It all seems to be fine - the printk appears but the command is
not executed...

any hint whats wrong ? any pointers to using kernel threads dosc/examples in
general and how to execute user space apps would be appreciated.

thx !
hofrat

--- broken hello world kthread ---
#define __KERNEL_SYSCALLS__

#include <linux/config.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/unistd.h>
#include <linux/kmod.h>
#include <linux/smp_lock.h>

#include <asm/uaccess.h>

char cmd_path[256] = "/bin/echo";

static int exec_cmd(void * kthread_arg)
{
static char * envp[] = { "HOME=/",
"TERM=linux",
"PATH=/:/bin:/usr/bin:/usr/bin",
NULL };
char *argv[] = { kthread_arg,
">>",
"/tmp/kthread_echo",
NULL };
int ret;

printk("calling usermodehelper for %s \n",cmd_path);
ret = exec_usermodehelper(cmd_path, argv, envp);

printk(KERN_ERR "failed to exec %s, ret = %d\n", cmd_path,ret);
return ret;
}

int init_module(void) {
pid_t pid;
char kthread_arg[]="Hello World";

pid = kernel_thread(exec_cmd, (void*) kthread_arg, 0);
if (pid < 0) {
printk(KERN_ERR "fork failed, errno %d\n", -pid);
return pid;
}
printk("fork ok, pid %d\n",pid);
return 0;
}

void cleanup_module(void) {
printk("module exit\n");
}


2002-09-02 16:14:49

by Petr Vandrovec

[permalink] [raw]
Subject: Re: kthread execve question

On 2 Sep 02 at 17:03, Der Herr Hofrat wrote:
>
> any hint whats wrong ? any pointers to using kernel threads dosc/examples in
> general and how to execute user space apps would be appreciated.
>
> char cmd_path[256] = "/bin/echo";
>
> static int exec_cmd(void * kthread_arg)
> {
> static char * envp[] = { "HOME=/",
> "TERM=linux",
> "PATH=/:/bin:/usr/bin:/usr/bin",
> NULL };
> char *argv[] = { kthread_arg,
> ">>",
> "/tmp/kthread_echo",

'>>' is bash thing. Try executing "/bin/touch" with "/tmp/testfile" instead.
If /tmp/testfile will appear, you got it.

And also do not forget that argv[0] should contain program name, not
first argument - so in most cases you want
exec_usermodehelper(argv[0], argv, envp) ...
Petr Vandrovec