pid存储在哪里
Where is the pid stored?
我在分配中有以下问题:
每一秒钟一个进程调用以下函数:
#include <string>
using namespace std;
string create_file_name(time_t timestamp) {
pid_t pid = getpid();
string s = “results-” + to_string(pid) + to_string(timestamp);
return s;
}
问题是内核将进程PID存储在哪里
有5种不同的答案:
用户的堆栈\内核的堆栈\堆\PCB \运行队列
现在,我通常知道PID存储在PCB中,但在这种情况下,它是否也应该存储在用户的堆栈中?(因为它是一个局部变量(
这个问题似乎只有一个答案,所以我很困惑。
如手册页所述:
从glibc 2.3.4版本到2.24版本(包括2.24版本(,glibcgetpid((缓存PID的包装器函数,目的是避免当进程重复调用getpid((时,会调用额外的系统。通常这种缓存是不可见的,但它的正确操作依赖于关于fork(2(、vfork(2(和克隆(2(:如果一个应用程序绕过了glibc包装器系统通过使用syscall(2(进行调用,然后在child会返回错误的值(准确地说:它会返回父进程的PID(。此外,在某些情况下即使通过调用clone(2(,getpid((也可能返回错误的值glibc包装器函数。(有关此类案例的讨论,请参阅克隆中的BUGS(2(。(此外,缓存代码的复杂性多年来一直是glibc内部一些bug的来源。
由于上述问题,由于glibc版本2.25PID缓存被删除:对getpid((的调用总是调用实际系统调用,而不是返回缓存的值。
在Alpha上,不是一对getpid((和getppid((系统调用,而是提供了一个getxpid((系统调用,它返回一对PID和父PID。glibc getpid((和getppid((包装器函数透明地处理这个问题。有关的详细信息,请参阅syscall(2(寄存器映射。
这取决于您使用的glibc
。事实上,在某些版本中,glibc
保留了一个pid的缓存,而在一些版本中,如果你想知道系统调用是如何工作的,它会重复调用系统调用来获取进程的pid。建议你查看内核代码。
您可以在此链接中找到getpid()
函数。(您可以更改内核版本并浏览所有源代码,以重建getpid()
系统调用的工作方式。
- 谷歌测试中的期望值存储在哪里
- 常量参数存储在哪里 (C++)?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- 模板参数在 C++ 中存储在哪里?
- 存储在 C++ 编译器中的标识符的定义(不是声明)在哪里?
- 变量或标识符存储在C++中究竟在哪里?
- C++ - thread_local变量存储在哪里?
- 返回值存储在哪里?
- Cmake忽略了我所有关于在boost::beast存储库中在哪里找到提升的指令
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 如果不在内存中,则在哪里存储表达式和常数
- C 在哪里存储固定大小数组的大小
- 在哪里存储Visitor模式中访问的每个元素的计算结果
- winsock在哪里存储套接字的ip地址?
- 在哪里存储用于OSX部署的Qt导入
- PST 文件中的日历邮件在哪里存储约会时间和日期