Board logo

标题: Linux学习技巧:两种方式创建内核线程 [打印本页]

作者: 苹果也疯狂    时间: 2011-10-17 19:55     标题: Linux学习技巧:两种方式创建内核线程

  kernel_thread()、daemonize()
  ------------------------------------------------------
  int thread_func(void *arg)
  {
  /*
  * 设置线程名 -- thread_name,ps可以看到的线程名
  * 如果不使用daemonize设置内核线程名,并且kernel_thread()
  * 是用户态程序通过系统调用使用的,则ps将看到一个和用户进程同名
  * 的一个内核线程。
  */
  daemonize("thread_name");
  return 0;
  }
  {
  pid_t pid;
  /* 创建内核线程 */
  pid = kernel_thread(thread_func, NULL, CLONE_KERNEL);
  if (pid < 0)
  {
  printk("kernel_thread error\n");
  }
  }
  kthread_run() -- 这种创建方式比较简洁
  ------------------------------------------------------
  int thread_func(void *arg)
  {
  return 0;
  }
  {
  struct task_struct * my_thread = NULL;
  my_thread = kthread_run(thread_func, NULL, "thread_name");
  if (IS_ERR(my_thread))
  {
  rc = PTR_ERR(my_thread);
  printk("error %d create thread_name thread", rc);
  }
  }
  kernel_thread()类似application编程里面的fork()
  ------------------------------------------------------
  static int jffs2_garbage_collect_thread(void *_c)
  {
  ...
  daemonize("jffs2_gcd_mtd%d", c->mtd->index);
  ...
  complete(&c->gc_thread_start);
  ...
  }
  int jffs2_start_garbage_collect_thread(struct jffs2_sb_info *c)
  {
  pid_t pid;
  int ret = 0;
  BUG_ON(c->gc_task);
  init_completion(&c->gc_thread_start);
  init_completion(&c->gc_thread_exit);
  pid =kernel_thread(jffs2_garbage_collect_thread, c, CLONE_FS|CLONE_FILES);
  if (pid < 0) { // 判断出错条件
  printk(KERN_WARNING "fork failed for JFFS2 garbage collect thread: %d\n", -pid);
  complete(&c->gc_thread_exit);
  ret = pid;
  } else { // pid > 0 ,说明这个肯定在父进程中
  printk(KERN_DEBUG "JFFS2: Garbage collect thread is pid %d\n", pid);
  wait_for_completion(&c->gc_thread_start); //父进程等待子进程结束
  }
  return ret;
  }
作者: queen32    时间: 2011-10-19 13:54

{ // 判断出错条件
  printk(KERN_WARNING "fork failed for JFFS2 garbage collect thread: %d\n", -pid);
  complete(&c->gc_thread_exit);
  ret = pid;
  } else { // pid > 0 ,说明这个肯定在父进程中
看不明白
作者: queen223    时间: 2011-10-19 14:46

创建内核线程这么麻烦啊




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0