kthread_create_on_node
kthread_create_on_node函数功能:指定存储节点创建新内核线程。源码如下:

操作实战
#include <linux/module.h>
#include <linux/pid.h>
#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/wait.h>
int MyThreadFunc(void* argc) {
    printk("MyThreadFunc\n");
    printk("MyThreadFuncPID: %d\n", current->pid);
    printk("Exit MyThreadFunc\n");
    return 0;
}
static int __init KthreadCreateOnNodeInit(void) {
    struct task_struct* pts = NULL;
    printk("KthreadCreateOnNodeInit\n");
    pts = kthread_create_on_node(MyThreadFunc, NULL, -1, "ktconode.c");
    
    printk("New thread PID: %d\n", pts->pid);
    wake_up_process(pts);
    printk("Curretn thread PID: %d\n", current->pid);
    return 0;
}
static void __exit KthreadCreateOnNodeExit(void) {
    printk("Exit kernel: KthreadCreateOnNodeExit\n");
}
MODULE_LICENSE("GPL");
module_init(KthreadCreateOnNodeInit);
module_exit(KthreadCreateOnNodeExit);
 

wake_up_process
wake_up_process函数功能:唤醒处于睡眠状态的进程,状态转换为RUNNING状态,让CPU重新调度处理。
- 唤醒成功返回1
 - 唤醒失败(该线程已经是RUNNING状态)返回0
 
源代码如下:

操作实战
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/module.h>
#include <linux/pid.h>
#include <linux/list.h>
#include <linux/delay.h>
struct task_struct* pts_thread = NULL;
int MyThreadFunc(void* argc) {
    int iData = -1;
    printk("MyThreadFunc\n");
    printk("MyThreadFunc PID: %d\n", current->pid);
    //查看父进程状态
    printk("初始化函数状态为: %ld\n", pts_thread->state);
    iData = wake_up_process(pts_thread);
    printk("wake_up_process之后父进程状态: %ld\n", pts_thread->state);
    printk("wake_up_process返回结果为: %d\n", iData);
    printk("Exit MyThreadFunc\n");
    return 0;
}
static int __init WakeUpProcessInit(void) {
    int res = 1; // 保存wake_up_process结果
    char cName[] = "wakeup.c%s";
    struct task_struct* pResult = NULL;
    long time_out;
    wait_queue_head_t head;
    wait_queue_entry_t data;
    printk("WakeUpProcessInit\n");
    //指定节点,创建新的内核线程
    pResult = kthread_create_on_node(MyThreadFunc, NULL, -1, cName);
    printk("New thread PID: %d\n", pResult->pid);
    printk("Current thread PID: %d\n", current->pid);
    init_waitqueue_head(&head);
    init_waitqueue_entry(&data, current);
    add_wait_queue(&head, &data);
    pts_thread = current;
    res = wake_up_process(pResult);
    printk("wake_up_process唤醒新线程之后的结果为: %d\n", res);
    time_out = schedule_timeout_uninterruptible(2000*10);
    res = wake_up_process(current);
    printk("唤醒当前线程的结果为: %d\n", res);
    
    printk("调用sched_timeout_uninterruptible返回结果为: %ld\n", time_out);
    printk("Exit WakeUpProcessInit\n");
    return 0;
}
static void __exit WakeUpProcessExit(void) {
    printk("Exit WakeUpProcessExit\n");
}
module_init(WakeUpProcessInit);
module_exit(WakeUpProcessExit);
 




















