Linux进程管理内核API函数kernel_thread( )

来源:互联网 发布:星际战甲网络没有反应 编辑:程序博客网 时间:2024/04/29 22:57

 

 

该函数在内核源码中的位置:linux-2.6.30/arch/x86/kernel/process_32.c,函数定义格式:int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)。

此函数用于创建一个新的内核线程,即完成在内核态创建一个子进程。 首先在内核地址空间为此线程分配内存空间,然后初始化与此线程相关的变量,最后调用do_fork( )函数创建一个新的线程,并返回新进程的进程号。

 

参数int (*fn) (void *) 是一个函数指针,即第一个参数是一个函数,此函数是此进程执行时执行的函数,此函数返回值为int型,参数是一个void 指针。

参数 void * arg是一个void 型指针,是传递给第一个参数所代表函数的参数,即子进程执行时函数的参数。

参数 flags 是创建新进程的标志位,在内核文件对此有定义,可能取值如下所列:

/include/sched.h:

#define CSIGNAL  0x000000ff     /*进程退出信号*/

#define CLONE_VM     0x00000100    /*进程间共享虚拟区 */

#define CLONE_FS      0x00000200    /*进程间共享文件系统信息*/

#define CLONE_FILES 0x00000400    /*进程间共享文件*/

#define CLONE_SIGHAND  0x00000800    /*共享信号处理函数及阻塞信号*/

#define CLONE_PTRACE 0x00002000         /*持续追踪子进程* /

#define CLONE_VFORK  0x00004000        /*子进程内存空间释放时唤醒父进程 */

#define CLONE_PARENT    0x00008000    /* 克隆进程共用同一父进程*/

#define CLONE_THREAD   0x00010000    /*相同的进程组*/

#define CLONE_NEWNS     0x00020000    /*新命名空间组*/

#define CLONE_SYSVSEM 0x00040000    /*共享系统的V SEM_UNDO变量*/

#define CLONE_SETTLS     0x00080000    /*为子进程创建新的TLS值*/

#define CLONE_PARENT_SETTID    0x00100000    /*设置父进程的TID值 */

#define CLONE_CHILD_CLEARTID  0x00200000    /*清除子进程的TID值*/

#define CLONE_DETACHED             0x00400000    /*此标志位没有被使用 */

#define CLONE_UNTRACED             0x00800000    /*进程禁止追踪*/

#define CLONE_CHILD_SETTID       0x01000000    /*设置子进程的TID值*/

#define CLONE_STOPPED         0x02000000    /*从停止状态启动*/

#define CLONE_NEWUTS          0x04000000    /*新uts命名组*/

#define CLONE_NEWIPC           0x08000000    /*新ipcs*/

#define CLONE_NEWUSER              0x10000000    /*新用户命名空间*/

#define CLONE_NEWPID           0x20000000    /*新pid命名空间*/

#define CLONE_NEWNET          0x40000000    /*新网络命名空间*/

#define CLONE_IO              0x80000000          /*克隆输入输出上下文内容 */

 

/*
* List of flags we want to share for kernel threads,
* if only because they are not used by them anyway.
*/
#define CLONE_KERNEL    (CLONE_FS | CLONE_FILES | CLONE_SIGHAND)

此函数返回一个整形变量,此值为新创建的进程的进程号。

实例解析

#include <linux/module.h>

#include <linux/sched.h>

#include <linux/pid.h>

MODULE_LICENSE("GPL");

//子进程执行的函数定义

int my_function(void * argc)   

{

       printk("<0>in the kernel thread function!\n");     

       printk("<0>the current pid is:%d\n",current->pid); //显示当前进行的进程号

       return 0;

}

//模块加载函数定义

static int __init kernel_thread_init(void)   

{     

       int result;

       printk("<0> into kernel_thread_init.\n");            

       result=kernel_thread(my_function,NULL,CLONE_KERNEL);  //创建一个新的进程

       printk("<0>the kernel_thread result is:%d\n",result);          //显示函数执行结果

       printk("<0>the current pid is:%d\n",current->pid);           //显示当前进程的进程号

       printk("<0> out kernel_thread_init.\n");

       return 0;

}

//模块退出函数定义

static void __exit kernel_thread_exit(void) 

{

        printk("<0>Goodbye  kernel_thread\n");

}

module_init(kernel_thread_init);

module_exit(kernel_thread_exit);

首先编译模块,执行命令insmod kernel_thread.ko插入模块,然后执行命令dmesg –c查看内核输出信息

说明创建新进程成功,父进程的进程号是7504,新创建的进程的进程号是7506,新进程对应的处理函数能够在创建完子进程之后被调用执行。

本文出自:《Linux内核API完全参考手册》邱铁,周玉,邓莹莹 编著,机械工业出版社 2011年1月1日出版

原创粉丝点击