Linux内核 kthread_stop()

函数:kthread_stop( )

文件包含:

        #include <linux/kthread.h>

函数定义:

在内核源码中的位置:linux-3.19.3/kernel/kthread.c

函数定义格式:

int kthread_stop (struct task_struct * k)

函数功能描述:

此函数用于终止输入参数k对应的进程。

输入参数说明:

参数task是struct task_struct型变量,保存任务的基本信息,其定义在文件linux-3.19.3/include/linux/sched.h,内核源码注释比较详细。

返回参数说明:

函数返回值对应被终止进程对应的函数返回值,对应函数kthread_create_on_node( )中输入的第一个参数的返回值,如果新创建的进程没有调用函数wake_up_process( )唤醒,则此函数返回-EINTR。

实例解析:

编写测试文件:kthread_stop.c

头文件引用:

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/pid.h>
#include <linux/wait.h>
#include <linux/kthread.h>
MODULE_LICENSE("GPL");

新进程执行的函数定义:

int my_function(void * argc)
{
    printk("in the kernel thread function! \n");
    printk("the current pid is:%d\n", current->pid);     //显示当前进程的PID值
    printk("out the kernel thread function\n");
    return 0;
}

模块加载函数定义:

static int __init kthread_stop_init(void)
{
    char namefrm[]="kthread_stop_init.c%s"; //输出类型名,在此程序中无影响
    struct task_struct * result;
    printk("into kthread_stop_init.\n");
    result=kthread_create_on_node(my_function, NULL, -1, namefrm);  //创建新进程
    printk("the pid of the new thread is:%d\n", result->pid); //显示当前进程的PID值
    wake_up_process(result);                                      //启动新的线程
    kthread_stop(result);                                         //停止新的线程
    printk("the current pid is:%d\n", current->pid);              //显示当前进程的PID值
    printk("out kthread_stop_init.\n");
    return 0;
}

模块退出函数定义:

static void __exit kthread_stop_exit(void)
{
    printk("Goodbye kthread_stop\n");
}

模块加载、退出函数调用:

module_init(kthread_stop_init);
module_exit(kthread_stop_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod kthread_stop.ko插入模块,然后执行命令dmesg -c查看内核输出信息,会出现如图所示的结果。

Linux内核 kthread_stop()

结果分析:

上图说明创建新进程成功,当前进程的进程号是3520,新创建的进程的进程号是3521,在新进程创建完成之后,执行函数wake_up_process( )唤醒新进程,然后调用函数kthread_stop( )终止新进程,输出结果显示新进程没有被执行,与kthread_create_on_node( )的输出结果进行对比,可以得出函数kthread_stop( )能够终止输入参数对应的进程。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!