- 论坛徽章:
- 0
|
测试程序如下, 主要想实现的功能是:主线程创建三个子线程,等待子线程处理完后退出。
但是发现主线程在创建完第一个子线程后就不继续执行了,不知道具体是什么原因,请高人给讲讲。
- #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);
复制代码 |
|