Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ pid存储在哪里?_C++_Process_Pid - Fatal编程技术网

C++ pid存储在哪里?

C++ pid存储在哪里?,c++,process,pid,C++,Process,Pid,我在作业中有以下问题: 在每一秒钟中,进程调用以下函数: #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; } #包括 使用名称空间std; 字符串创建文件名(时间戳){ p

我在作业中有以下问题:
在每一秒钟中,进程调用以下函数:

#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;
}
#包括
使用名称空间std;
字符串创建文件名(时间戳){
pid_t pid=getpid();
字符串s=“结果-”+到字符串(pid)+到字符串(时间戳);
返回s;
}
问题是内核在哪里存储进程PID?
有5种不同的答案:
用户堆栈\内核堆栈\堆\ PCB\runqueue

一般来说,我知道PID存储在PCB中,但在这种情况下,它是否也应该存储在用户堆栈中?(因为它是一个局部变量)。

这个问题似乎只有一个答案,所以我很困惑。

正如主页上所说:

从glibc 2.3.4版到2.24版,glibc getpid()缓存PID的包装函数,目的是避免 当一个进程重复调用getpid()时,会有额外的系统调用。 通常这种缓存是不可见的,但其正确操作依赖于 关于fork(2)、vfork(2)和 克隆(2):如果应用程序绕过了这些 通过使用syscall(2)进行系统调用,然后在 child将返回错误的值(准确地说:它将返回 父进程的PID)。此外,还有一些案例 getpid()即使在通过调用克隆(2)时也可能返回错误的值 glibc包装函数。(有关一个此类案例的讨论,请参见 克隆中的bug(2)此外,缓存代码的复杂性 多年来一直是glibc内部一些bug的来源

由于上述问题,自glibc 2.25版以来 PID缓存已删除:对getpid()的调用始终调用实际的 系统调用,而不是返回缓存的值

在Alpha上,不是一对getpid()和getppid()系统调用,而是 提供了一个getxpid()系统调用,它返回一对PID 和父PID。glibc getpid()和getppid()包装函数 透明地处理这个问题。有关详细信息,请参阅syscall(2) 寄存器映射

它取决于您使用的
glibc
。事实上,在某些版本中,
glibc
包含一个pid缓存,而在某些版本中,如果您想知道系统调用如何工作,它会重复调用系统调用以获取进程的pid,并建议您查看内核代码

您可以在此处找到
getpid()
函数。(您可以更改内核版本并导航所有源代码,以重建
getpid()
syscall的工作方式