struct pid *find_get_pid(pid_t nr)根据进程号pid_t nr nr得到进程描述符struct pid ,并将进程描述符中的字段count加1
这里的进程描述符定义如下:
struct pid
{atomic_t count;unsigned int level;/* lists of tasks that use this pid */struct hlist_head tasks[PIDTYPE_MAX];struct rcu_head rcu;struct upid numbers[1];
};
其使用的例子如下:static int proc_do_cad_pid(struct ctl_table *table, int write,void __user *buffer, size_t *lenp, loff_t *ppos)
{struct pid *new_pid;pid_t tmp;int r;tmp = pid_vnr(cad_pid);r = __do_proc_dointvec(&tmp, table, write, buffer,lenp, ppos, NULL, NULL);if (r || !write)return r;new_pid = find_get_pid(tmp);if (!new_pid)return -ESRCH;put_pid(xchg(&cad_pid, new_pid));return 0;
}
其源码分析如下:struct pid *find_get_pid(pid_t nr)
{struct pid *pid;rcu_read_lock();pid = get_pid(find_vpid(nr));rcu_read_unlock();return pid;
}
这里通过find_vpid(nr) 来找到进程描述符,然后通过get_pid来让count字段加1
首先看get_pid来让count字段加1
static inline struct pid *get_pid(struct pid *pid)
{if (pid)atomic_inc(&pid->count);return pid;
}
如果pid 不为NULL的话,就通过atomic_inc 来让count字段加1
其次看看通过find_vpid 找到进程描述符
struct pid *find_vpid(int nr)
{
//通过task_active_pid_ns 找到当前进程的namespace,这里有个小疑问,为啥nr一定会在当前的namesapce内呢?return find_pid_ns(nr, task_active_pid_ns(current));
}
struct pid *find_pid_ns(int nr, struct pid_namespace *ns)
{struct upid *pnr;
//kernel中所有的pid都是放在pid_hash 中的,然后根据nr和ns找到对应的pid_hash的list,
最后遍历这个pid_hash,找到进程描述符要符合两个条件,一个是进程描述符的pid 要等于nr,另外一个是进程描述符的namaspce 要得到ns,也就是当前进程的namespacehlist_for_each_entry_rcu(pnr,&pid_hash[pid_hashfn(nr, ns)], pid_chain)if (pnr->nr == nr && pnr->ns == ns)
//这里根据struct pid 中成员变量level 返回struct pid的指针return container_of(pnr, struct pid,numbers[ns->level]);return NULL;
}

进程管理API之find_get_pid相关推荐

  1. 进程管理API之pid_nr/pid_vnr/pid_nr_ns

    inline pid_t pid_nr(struct pid *pid) 的主要是获得进程的全局pid号,也就是从init 所在的namespace看到的pid号 pid_nr() : global ...

  2. boost:进程管理

    概述 Boost.Process提供了一个灵活的C++ 进程管理框架.它允许C++ developer可以像Java和.Net程序developer那样管理进程.它还提供了管理当前执行进程上下文.创建 ...

  3. Atitit.研发管理---api版本号策略与版本控制

    Atitit.研发管理---api版本号策略与版本控制 1. 1.2.1版本概述1 2. 3主版本号策略2 3. 1PATCH版本策略2 3.1. 1.2.2.1次版本号策略2 表3-1 APR中支持 ...

  4. Linux—进程管理

    1. 进程的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时间使用同一个linux系统:多任务是指在Linux下可以同时执行多个任务,更详细的说,linux采用了分时管理的 ...

  5. PM2 进程管理工具使用总结

    注:2016年的文章,发在掘金上,不知道是否过时了. 对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本.关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodej ...

  6. java实现进程管理,Java调用批处理或可执行文件和Runtime、Process类实现Java版进程管理器...

    Java调用批处理或可执行文件 用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现.下面是一种比 ...

  7. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

  8. Android系统中的进程管理:内存的回收

    本文是Android系统进程管理的第三篇文章.进程管理的前面两篇文章,请参见这里: Android系统中的进程管理:进程的创建 Android系统中的进程管理:进程的优先级 本文适合Android平台 ...

  9. Android系统中的进程管理:进程的创建

    对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...

最新文章

  1. Android基于IIS的APK下载(五)IIS的配置
  2. exp oracle所有数据库命令,oracle数据库exp命令
  3. 《一起》个人进展——Day06
  4. 轻松使用zstd来解压缩
  5. 华为数通HCIE面试题目解密系列之RSTP边缘端口
  6. 【剑指offer】面试题11:旋转数组的最小数字(java)
  7. python函数库_10. 标准库简介
  8. LRU算法数组实现超简单
  9. 23.备忘录模式(Memento Pattern)
  10. SVN 与CVS 和VSS的区别
  11. windows下如何下载g++以及gcc
  12. 机器视觉——相机标定(摄像机标定)
  13. 用ESP8266获取网页信息+获取b站粉丝数案例
  14. 苹果描述文件服务器证书无效,22.iOS企业版证书、描述文件过期问题解决
  15. 程序员如何学习量化交易,一文总结
  16. 妙计旅行一面试题:字符串反转
  17. foxmail 登陆gmail报密码错误
  18. 爬虫实战爬取豆瓣电影Top250榜单电影
  19. 千锋教育python老师_千锋老师分享Python经典面试题
  20. zipfile — 访问 ZIP 压缩文件

热门文章

  1. 搞懂异地多活,看这篇就够了
  2. 新建word文档没保存能恢复吗(已有579人收藏)
  3. intern()详解
  4. 宇视科技实习生笔试面试经历
  5. 技巧分享-如何给电脑“重装”系统(win10)
  6. 设计师们如何高调拒绝免费工作
  7. 实验一 网络流量捕获实验
  8. 算法每日一题——第六天——干草堆(差分)
  9. jxl导出excel标题乱码
  10. No module named six