getpid()的缓存问题
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()的缓存问题相关推荐
- java memorycache原理_JVM代码缓存区CodeCache原理及用法解析
一. CodeCache简介 从字面意思理解就是代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(native code).当 ...
- 为什么说dubbo的声明式缓存不好用!!!
title: 为什么说dubbo的声明式缓存不好用!!! tags: dubbo mock zookeeper cache cluster categories: dubbo date: 2017-0 ...
- printf的缓存问题
printf的缓存问题 #include <iostream> #include <sys/types.h> #include <unistd.h>using na ...
- Redis学习、缓存、持久化、哨兵模式
个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 我写代码是为了更好的表达自我,这是艺术创作,而不单单是为了把事情搞定. -Antirez ...
- 通过qq缓存图片,找到QQ号码,python版本
2019独角兽企业重金招聘Python工程师标准>>> ''' 通过qq缓存图片,找到QQ号码,参照下面网址链 http://www.oschina.net/question/232 ...
- setns对当前进程无效问题的排查(getpid获取值不变)
1)复现流程及lxc的处理 demo1程序与执行结果如下,此时在容器内部看不到执行的程序. int main() {int ret, fd, pid;printf("father pid o ...
- mybatis懒加载与缓存
在接触mybatis时我们会学到接触小知识,关于懒加载的一些知识点还是需要亲自去测试一下才能加深理解; mybatis懒加载与缓存 mybatis对缓存的支持 mybatis一级缓存 mybatis的 ...
- Spring中启用Hibernate二级缓存步骤
1.在applicationContext.xml配置文件中SessionFactory bean中配置缓存 <!-- 配置会话工厂对象 --> <bean id="se ...
- Redis 预防缓存穿透“神器” — 布隆过滤器
1. 布隆过滤器 1.1 概念 在架构设计时有一种最常见的设计被称为布隆过滤器,它可以有效减少缓存穿透的情况.其主旨是采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在. 布隆 ...
最新文章
- HTML5 随机弹跳的小球
- Spring Cloud构建微服务架构(四)分布式配置中心
- scrapy python3.8_银狐DevNet-网络运维Python初篇(四)netmiko抓取华为网络配置并存入本地...
- 解决数据库 Table 'content_tags' is marked as crashed and should be repaired 表损坏问题
- 对于这款APP,我充了个终身VIP!!!
- html里面表格问题
- java word转pdf linux_Linux平台中使用PHP把word转pdf的实现方法
- OpenCV学习笔记:矩阵/向量处理
- WSL2 Docker Distro迁移
- 经纬财富:沧州散户炒白银必读
- 计算机太极之光,3000多名研究生赛太极,五大太极拳流派名家展风采
- 有哪些堪称PPT神器插件?用好这10款,让你像开挂了一样设计PPT!
- php ldap 登陆验证,LDAP用户验证功能简介
- js 对象的键名 可以是数字么
- c 开发android ios实例,使用 C++ 进行跨平台移动开发
- freemarker根据模板生成word文档,换行
- 网易实习第11天--制作第一个ios应用
- 华为一前员工【惯例】失败案例分享
- matlab 图像卷积的方法与应用
- 用VASP求硅的电子态密度和能带