pid存储在哪里

Where is the pid stored?

本文关键字:在哪里 存储 pid      更新时间:2024-09-28

我在分配中有以下问题:
一秒钟一个进程调用以下函数:

#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()系统调用的工作方式。