LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 833|回复: 4

请教一个 内核进程编程的问题

[复制链接]
发表于 2005-7-21 10:00:56 | 显示全部楼层 |阅读模式
怎样杀掉内核中的线程(由kernel_thread生成的),而且可能是某个线程要杀死自己,最好给出参考的代码及注释,我是新手^_^
发表于 2005-7-21 11:31:54 | 显示全部楼层
沙发
回复 支持 反对

使用道具 举报

发表于 2005-7-21 11:32:17 | 显示全部楼层
在workqueue中创建(因为它把SIGCHLD的处理方式设为SIG_IGN了),创建时,在kernel_thread的最后一个参数上加SIGCHLD.
要自杀,直接返回就是了。要他杀,可以设置一个变量,在内核进程被唤醒时检查,然后返回。
具体可以参考workqueue的destroy方式.下面是个简单的例子.

static struct work_struct work;
static int noop(void *dummy)
{
        printk("Exiting\n");
        return 0;
}
static void create_thread(void *dummy)
{
        kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD);
}
static int test_init(void)
{
        INIT_WORK(&work, create_thread, NULL);
        schedule_work(&work);
}
static void test_exit(void) {}
module_init(test_init);
module_exit(test_exit);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-21 17:37:51 | 显示全部楼层
Post by daemeon
在workqueue中创建(因为它把SIGCHLD的处理方式设为SIG_IGN了),创建时,在kernel_thread的最后一个参数上加SIGCHLD.
要自杀,直接返回就是了。要他杀,可以设置一个变量,在内核进程被唤醒时检查,然后返回。
具体可以参考workqueue的destroy方式.下面是个简单的例子.

static struct work_struct work;
static int noop(void *dummy)
{
        printk("Exiting\n");
        return 0;
}
static void create_thread(void *dummy)
{
        kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD);
}
static int test_init(void)
{
        INIT_WORK(&work, create_thread, NULL);
        schedule_work(&work);
}
static void test_exit(void) {}
module_init(test_init);
module_exit(test_exit);


我的内核是2.4.18,里面好像没有struct work_struct结构和INIT_WORK宏 :ask
回复 支持 反对

使用道具 举报

发表于 2005-7-21 18:43:25 | 显示全部楼层
2.4里有一个task queue,不知可不可以代替workqueue.自己试试吧,出事了不要找我喔 :ask  :ask
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表