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日出版
- Linux进程管理内核API函数kernel_thread( )
- linux内核函数kernel_thread
- 进程管理API之kernel_thread
- Linux进程管理内核API函数pid_task( )
- Linux内核中 kernel_thread函数的若干问题说明
- 内核线程函数kernel_thread解析
- 用kernel_thread创建的内核进程,在内核中调用什么函数可以杀死这个进程
- 【Linux 内核】进程管理
- Linux内核-进程管理
- Linux内核之进程管理
- linux内核如何管理进程
- linux内核学习----进程管理
- Linux内核之进程管理
- Linux内核—进程管理
- Linux内核之进程管理
- linux 内核进程管理子系统
- Linux内核之进程管理
- Linux内核之进程管理
- 来点氧气吧
- VC中获得窗口句柄的方法总结
- 年轻工程师是如何锻炼成“高手”的[转载]
- webelement中的方法getText()和getAttribute(java.lang.String name)
- JBPM4学习笔记
- Linux进程管理内核API函数kernel_thread( )
- SAP算法心得 ~转的吧
- STL_stack
- Fiddler - 前端开发值得拥有
- IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)
- Android--制作开场动画/MediaPlayer.OnCompletionListener
- 分布式应用
- OSGi bundle生命周期
- 关于全部变量的引用