glibc 2.3.4 到 2.25 之间的版本实现了getpid()的结果缓存功能,通过glibc的fork()、vfork()、clone()等函数进行支持,但由于上层应用可以通过syscall来旁路glibc的fork()等函数,这会导致如果在创建子进程之前有调getpid(),那么子进程通过getpid()获取的结果是之前缓存的父进程的pid。通过strace命令可以看到这一过程,虽然程序中有多处调用了getpid()函数,但getpid()系统调用只出现了一次。因此,在glibc 2.25以后getpid()的结果缓存功能被移除了。

以下代码使用glibc 2.17版本,可以复现这一过程:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/syscall.h>int test_bypass_fork(void) {pid_t pid = 0;int status = 0;printf("I'm parent process and my pid is: %d\n", getpid());pid = syscall(SYS_fork);if (pid > 0) {printf("I'm parent process and my child's pid is: %d\n", pid);} else if (pid == 0) {printf("I'm child porcess and my pid is: %d, my parent's pid is: %d\n", getpid(), getppid());}waitpid(pid, &status, WUNTRACED | WCONTINUED);return 0;
}int main(void) {test_bypass_fork();return 0;
}

运行结果

$ ./main
I'm parent process and my pid is: 18475
I'm parent process and my child's pid is: 18476
I'm child porcess and my pid is: 18475, my parent's pid is: 18475

getpid()的缓存问题相关推荐

  1. java memorycache原理_JVM代码缓存区CodeCache原理及用法解析

    一. CodeCache简介 从字面意思理解就是代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(native code).当 ...

  2. 为什么说dubbo的声明式缓存不好用!!!

    title: 为什么说dubbo的声明式缓存不好用!!! tags: dubbo mock zookeeper cache cluster categories: dubbo date: 2017-0 ...

  3. printf的缓存问题

    printf的缓存问题 #include <iostream> #include <sys/types.h> #include <unistd.h>using na ...

  4. Redis学习、缓存、持久化、哨兵模式

    个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 我写代码是为了更好的表达自我,这是艺术创作,而不单单是为了把事情搞定. -Antirez ...

  5. 通过qq缓存图片,找到QQ号码,python版本

    2019独角兽企业重金招聘Python工程师标准>>> ''' 通过qq缓存图片,找到QQ号码,参照下面网址链 http://www.oschina.net/question/232 ...

  6. setns对当前进程无效问题的排查(getpid获取值不变)

    1)复现流程及lxc的处理 demo1程序与执行结果如下,此时在容器内部看不到执行的程序. int main() {int ret, fd, pid;printf("father pid o ...

  7. mybatis懒加载与缓存

    在接触mybatis时我们会学到接触小知识,关于懒加载的一些知识点还是需要亲自去测试一下才能加深理解; mybatis懒加载与缓存 mybatis对缓存的支持 mybatis一级缓存 mybatis的 ...

  8. Spring中启用Hibernate二级缓存步骤

    1.在applicationContext.xml配置文件中SessionFactory  bean中配置缓存 <!-- 配置会话工厂对象 --> <bean id="se ...

  9. Redis 预防缓存穿透“神器” — 布隆过滤器

    1. 布隆过滤器 1.1 概念 在架构设计时有一种最常见的设计被称为布隆过滤器,它可以有效减少缓存穿透的情况.其主旨是采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在. 布隆 ...

最新文章

  1. HTML5 随机弹跳的小球
  2. Spring Cloud构建微服务架构(四)分布式配置中心
  3. scrapy python3.8_银狐DevNet-网络运维Python初篇(四)netmiko抓取华为网络配置并存入本地...
  4. 解决数据库 Table 'content_tags' is marked as crashed and should be repaired 表损坏问题
  5. 对于这款APP,我充了个终身VIP!!!
  6. html里面表格问题
  7. java word转pdf linux_Linux平台中使用PHP把word转pdf的实现方法
  8. OpenCV学习笔记:矩阵/向量处理
  9. WSL2 Docker Distro迁移
  10. 经纬财富:沧州散户炒白银必读
  11. 计算机太极之光,3000多名研究生赛太极,五大太极拳流派名家展风采
  12. 有哪些堪称PPT神器插件?用好这10款,让你像开挂了一样设计PPT!
  13. php ldap 登陆验证,LDAP用户验证功能简介
  14. js 对象的键名 可以是数字么
  15. c 开发android ios实例,使用 C++ 进行跨平台移动开发
  16. freemarker根据模板生成word文档,换行
  17. 网易实习第11天--制作第一个ios应用
  18. 华为一前员工【惯例】失败案例分享
  19. matlab 图像卷积的方法与应用
  20. 用VASP求硅的电子态密度和能带

热门文章

  1. 从零开始创建一个vue项目 1
  2. AndroidStudio 调试时部分断点不停
  3. 异想家纯C语言矩阵运算库
  4. 天然气阶梯是按年还是按月_燃气阶梯价是按自然年算吗
  5. 纸黄金投资中的技术分析技巧
  6. Java Swing中文乱码解决方法
  7. Day2 - 基础语法和变量
  8. DJango项目实例_资产管理系统01
  9. vue 2.0 结合iview UI组件使用分页功能
  10. linux Ubuntu将默认bash修改为csh