vimer linux kernel 爱好者

kernel进程管理API

2014-11-21

#函数

__task_pid_nr_ns(struct task_struct *task,enum pid_type type,struct pid_namespace *ns) #文件包含 #include<linux/sched.h> #函数定义 ##在内核源代码的位置 linux-3.2.64/kernel/pid.c ##函数定义格式:

pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,
		struct pid_namespace *ns)
{
	pid_t nr =0;
	rcu_read_lock();
	if (!ns)
		ns = current->nsproxy->pid_ns;
	if (likely(pid_alive(task))) {
		if (type != PIDTYPE_PID)
			task = task->group_leader;
		nr = pid_nr_ns(task->pid[type].pid,ns);
	}
	rcu_read_unlock();
	return nr;
}
EXPORT_SYSBOL(__task_pid_nr_ns);

#函数功能描述 此函数用于获取进程的进程号,但应该满足以下几个条件。 1.参数type如果不等于PIDTYPE_PID,则参数task用其所属任务组的第一个任务赋值,否则保持task不变。

2.此进程是参数task任务描述符的进程。

3.保证进程描述符和pid_namespaces和参数ns相同。

#参数补充(未写)

/*linux/pid.h*/
enum pid_type
{
	PIDTYPE_PID, //进程的进程号
	PIDTYPE_PGID, //process group' leader process ID
	PIDTYPE_SID,  //session' leader process ID
	PIDTYPE_MAX
};
/*
 *linux/pid_namespace.h
 */
struct pidmap {
	atomic_t nr_free;
	void *page;
}
struct pid_namespace {
	/*kerf is reference count,代表此命名空间在多少进程中被使用*/
	struct kref kref;
	/*current system PID */
	struct pidmap pidmap[PIDMAP_ENTRIES];
	/*上一次分配给进程的PID的值*/
	int last_pid;
	/*保存指向该进程的struct_task的指针*/
	struct task_struct *child_reaper;
	/*指向该进程在cache中的分配空间*/
	struct kmem_cache *pid_cachep;
	/*初始化为0,从level内核可知进程关联多少ID*/
	unsigned int level;
	struct pid_namespace *parent;
#ifdef CONFIG_PROC_FS
	struct vfsmount *proc_mnt;
#endif
#ifdef CONFIG_BSD_PROCESS_ACCT
	struct bsd_acct_struct *bacct;
#endif
};
extern struct pid_namespace init_pid_ns;

#举例

/*
 *include head file
 */
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/pid.h>
/*
 *per 
 */
MODULE_LICENSE("GPL");
/*
 *define subprocess function  
 */
int my_function(void *argc)
{
	printk("<0>in the kernel thread function\n");
	return 0;
}
static int __init __task_pid_nr_ns_init(void)
{
	int result;
	printk("<0> into __task_pid_nr_ns_init.\n");
	/*
	 *Create a new process
	 */
	result = kernel_thread(my_function,NULL,CLONE_KERNEL);
	/*
	 *get subprocess pid
	 */
	struct pid *kpid = find_get_pid(result);
	/*
	 *get 进程所属的任务描述符
	 */
	struct task_struct *task = pid_task(kpid, PIDTYPE_PID);
	/*
	 *获取任务对应进程的进程描述符
	 */
	pid_t result1 = __task_pid_nr_ns(task, PIDTYPE_PID, kpid->numbers[kpid->level].ns);
	/*
	 *显示返回值的进程号
	 *
	 */
	printk("<0> the pid of the find_get_pid is :%d\n",kpid->numbers[kpid -> level].nr);
	/*
	 *显示函数find_get_pid()返回值的进程描述符
	 */
	printk("<0> the result of __task_pid_nr_ns is :%d\n",result1);
	/*
	*显示函数kernel_thread()的返回值
	*/
	printk("<0> the result of kernel_thread is :%d\n",result);
	/*显示当前进程号
	   */
	printk("<0> the pid of current thread is :%d\n",current->pid);
	printk("<0> out __task_pid_nr_ns_init.\n");
	return 0;
}
static void __exit __task_pid_nr_ns_exit(void)
{
	printk("<0> Goobye __task_pid_nr_ns\n");
}
/*
 *load and exit
 */
module_init(__task_pid_nr_ns_init);
module_exit(__task_pid_nr_ns_exit);

结合以前的知识,写出Makefile,执行

make

然后,键入

insmod __task_pid_nr_ns.ko

这时一般终端就会有消息产出,如果没有可以接着使用 __dmesg -c__命令 ##终端信息

Message from syslogd@debian at Nov 21 15:28:12 ...
 kernel:[  458.244921]  into __task_pid_nr_ns_init.

Message from syslogd@debian at Nov 21 15:28:12 ...
 kernel:[  458.244971]  the pid of the find_get_pid is :2915

Message from syslogd@debian at Nov 21 15:28:12 ...
 kernel:[  458.244980]  the result of __task_pid_nr_ns is :2915

Message from syslogd@debian at Nov 21 15:28:12 ...
 kernel:[  458.244988]  the result of kernel_thread is :2915

Message from syslogd@debian at Nov 21 15:28:12 ...
 kernel:[  458.244995]  the pid of current thread is :2914

Message from syslogd@debian at Nov 21 15:28:12 ...
 kernel:[  458.245002]  out __task_pid_nr_ns_init.

Message from syslogd@debian at Nov 21 15:28:12 ...
 kernel:[  458.245964] in the kernel thread function
dmesg -c
dmesg: klogctl failed: 不允许的操作
yubo@debian:~/linux/process$ 

#find_get_pid() 定义:struct pid *find_get_pid(int nr) ##功能 此函数根据提供的进程号获取对应的进程描述符,并使进程描述符的count的值加1即此进程的用户数加1

##参数说明 nr即为进程号 ##返回参数 返回与参数提供的进程号对应的进程描述符,进程描述符定义如下:

struct pid {
	/*此进程的任务数*/
	atomic_t count;
	/*level对应成员number[]的下标,一般取值为0*/
	unsigned int level;
	/*此进程的任务列表*/
	struct hlist_head tasks[PIDTYPE_MAX];
	struct rcu_head rcu;
	/*struct upid类型的数组*/
	struct upid numbers[1];
};
struct uoid {
	int nr;
	struct pid_namespace *ns;
	struct hlist_node pid_chain;
};
extern struct pid init_struct_pid;

##find_get_pid()应用举例

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

/*
 * define subprocess
 */
int my_function(void *argc)
{
	printk("<0> in the kerenl thread function!\n");
	return 0;
}
/*
 * load module function
 *
 */
static int __init find_get_pid_init(void)
{
	int result;
	printk("<0> into the find_get_pid_init.\n");
	/*
	 * create a new process, the value of return is a int num,also called 
	 * process id  
	 */
	result = kernel_thread(my_function,NULL,CLONE_KERNEL);
	/*
	 * According to process id,call zhe function,get the process descriptor
	 * information, wait ...atomc_t?
	 */
	struct pid *kpid = find_get_pid(result);
	/*
	 * how many time use the function
	 */
	printk("<0> the count of the pid is :%d\n",kpid->count);
	/*
	 * level
	 */
	printk("<0> the level of the pid is :%d\n",kpid->level);

	/*
	 * display PID
	 */
	printk("<0> the pid of the find_get_pid is :%d\n",kpid->numbers[kpid->level].nr);
	/*
	 * display kernel_thread's return value
	 */
	printk("<0> the result of the kernel_thread is :%d\n",result);
	printk("<0> out find_get_pid_init.\n");
	return 0;	
}
/*
 * quit module define
 */
static void __exit find_get_pid_exit(void)
{
	printk("<0> Goodbye find_get_pid");
}
module_init(find_get_pid_init);
module_exit(find_get_pid_exit);

##输出结果

Message from syslogd@debian at Nov 23 05:42:16 ...
 kernel:[ 3162.689851]  into the find_get_pid_init.

Message from syslogd@debian at Nov 23 05:42:16 ...
 kernel:[ 3162.689863]  the count of the pid is :2

Message from syslogd@debian at Nov 23 05:42:16 ...
 kernel:[ 3162.689864]  the level of the pid is :0

Message from syslogd@debian at Nov 23 05:42:16 ...
 kernel:[ 3162.689866]  the pid of the find_get_pid is :3554

Message from syslogd@debian at Nov 23 05:42:16 ...
 kernel:[ 3162.689867]  the result of the kernel_thread is :3554

Message from syslogd@debian at Nov 23 05:42:16 ...
 kernel:[ 3162.689868]  out find_get_pid_init.

Message from syslogd@debian at Nov 23 05:42:16 ...
 kernel:[ 3162.690635]  in the kerenl thread function!

上一篇 创业

Comments

Content