Chinaunix
标题:
关于内核线程的问题,请教高人
[打印本页]
作者:
wuzhao
时间:
2009-10-05 16:40
标题:
关于内核线程的问题,请教高人
用kernel_thread创建一个线程后,在该线程的中能否再次创建子进程?能否使用sys_wait4等待子线程的退出?
作者:
wuzhao
时间:
2009-10-05 18:14
测试程序如下, 主要想实现的功能是:主线程创建三个子线程,等待子线程处理完后退出。
但是发现主线程在创建完第一个子线程后就不继续执行了,不知道具体是什么原因,请高人给讲讲。
#include <linux/config.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/system.h>
#include <asm/processor.h>
#include <asm/signal.h>
#define TIME (10 * HZ)
DECLARE_WAIT_QUEUE_HEAD(test_wait);
static int parent_id = 0;
int test1(void *data)
{
struct task_struct *tsk = current;
int a = 0;
DECLARE_WAITQUEUE(wait1, current);
strcpy(tsk->comm, "test");
for (;;){
add_wait_queue(&test_wait, &wait1);
set_current_state(TASK_INTERRUPTIBLE);
printk(KERN_ERR"kptest1 running.....\n");
if (a == 2)
return 0;
a++;
schedule_timeout(TIME);
}
return 0;
}
int parent_thread(void *data)
{
int i = 0;
int g_pid[3];
struct task_struct *tsk = current;
int pid;
DECLARE_WAITQUEUE(wait, current);
strcpy(tsk->comm, "parent");
daemonize(); /*without attached user resources*/
reparent_to_init();
unblock_all_signals();
add_wait_queue(&test_wait, &wait);
set_current_state(TASK_INTERRUPTIBLE);
for (i=0; i<3; i++)
{
g_pid[i] = kernel_thread(test1, NULL,
CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD);
if (g_pid[i] > 0)
}
printk("g_pid[] = %d,%d,%d\n", g_pid[0], g_pid[1], g_pid[2]);
i = 3;
while(i != 0)
{
int index;
pid = sys_wait4(-1, NULL, 0, NULL);
for(index=0; index < 3; index++)
{
if(pid == g_pid[index])
{
printk("g_pid[%d]...exit\n", index);
i--;
}
}
}
return 0;
}
static int __init test_init(void)
{
int pid;
printk("Starting test multi_threaded...\n");
pid = kernel_thread(parent_thread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD );
if (pid > 0) {
parent_id = pid;
}
return 0;
}
module_init(test_init);
static void __exit test_exit(void)
{
int ret;
/* Kill the thread */
ret = kill_proc(parent_id, SIGKILL, 1);
printk("test multi_threaded exit.\n");
}
module_exit(test_exit);
复制代码
作者:
wuzhao
时间:
2009-10-08 00:10
自己来结贴吧,创建线程中加上CLONE_VFORK参数,一切OK~
for (i=0; i<3; i++)
{
g_pid[i] = kernel_thread(test1, NULL,
CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD |CLONE_VFORK );
}
复制代码
作者:
ryan3216
时间:
2009-10-09 21:24
提示:
作者被禁止或删除 内容自动屏蔽
作者:
wuzhao
时间:
2009-10-10 13:28
内核是2.4.20版本,头文件是从别的地方直接复制的,没多考虑。呵呵
弱弱地问一句,从config.h怎么就看出版本低了呢?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2