- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在上我的第一门操作系统课,所以希望我在这里没有任何大的误解。
我想知道为什么 getpid() 在 Linux 中实现为系统调用。据我了解,某些功能被制成系统调用,因为它们访问或更改操作系统可能想要保护的信息,因此它们被实现为系统调用,以便将控制权转移到内核。
但据我了解,getpid() 只是返回调用进程的进程 ID。是否存在不授予此信息许可的情况?简单地让 getpid() 成为一个普通的用户函数难道不安全吗?
感谢您的帮助。
最佳答案
在没有系统调用的情况下实现 getpid() 的唯一方法是先执行一个系统调用并缓存其结果。然后每次调用 getpid() 都将返回该缓存值,而无需系统调用。
但是,Linux 手册页项目解释了为什么不缓存 getpid():
From glibc version 2.3.4 up to and including version 2.24, the glibc
wrapper function for getpid() cached PIDs, with the goal of avoiding
additional system calls when a process calls getpid() repeatedly.
Normally this caching was invisible, but its correct operation relied
on support in the wrapper functions for fork(2), vfork(2), and
clone(2): if an application bypassed the glibc wrappers for these
system calls by using syscall(2), then a call to getpid() in the
child would return the wrong value (to be precise: it would return
the PID of the parent process). In addition, there were cases where
getpid() could return the wrong value even when invoking clone(2) via
the glibc wrapper function. (For a discussion of one such case, see
BUGS in clone(2).) Furthermore, the complexity of the caching code
had been the source of a few bugs within glibc over the years.
Because of the aforementioned problems, since glibc version 2.25, the
PID cache is removed: calls to getpid() always invoke the actual
system call, rather than returning a cached value.
总而言之,如果 getpid() 被缓存,它可能会返回错误的值(即使缓存完美地完成而不允许任何程序写入等......)并且它是错误的来源过去。
通常您只需要在任何进程中调用一次 getpid(),如果您多次使用结果,请将其保存在变量中(应用程序级缓存!)。
干杯!
关于linux - 为什么将getpid实现为系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42086849/
我正在尝试运行这段 hello world 代码: #include #include #include #include char string1[] = "\n Hello"; char
在 Pthreads 手册页中提到 Calls to getpid(2) return a different value in each thread 在 LinuxThreads 部分。 我创建了
我有一个应用程序,我需要编写一个新的 getpid 函数来替换原来的操作系统。实现类似于: pid_t getpid(void) { if (gi_PID != -1) {
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我四处搜索,但无法找到我要找的东西。我知道 getpid() 返回调用进程的进程 ID,getppid() 返回调用进程父进程的进程 ID。但是有没有函数可以获取程序的进程ID呢?或者这就是上述两者之
我尝试将 getpid 系统调用的结果打印到标准输出。 这是我的汇编代码: ;getpid.asm [SECTION .txt] global _start _start: xor eax,
尝试在 linux-mint 上运行 c++ prog 时出现此错误,$制作 g++ -c -O3 common.cc common.cc: In function ‘float getCurr
我读到 syscall(39) 返回当前进程 ID (pid) 那为什么这2个程序输出2个不同的数字呢? int main() { long r = syscall(39); prin
我最近开始了一门关于操作系统的类(class),我的一项作业涉及从调用系统库的代码中跟踪系统调用 getpid(),通过它在操作系统中的实现,返回到系统库和用户程序。我真的很迷茫,不知道从哪里开始。我
我是c语言和Linux新手。我有一个与 fork()、getpid() 和 exec() 函数相关的问题。我使用 fork() 调用编写了一个 C 程序,我的程序代码如下”代码: #include
这个问题很快:)。我知道 srand() 用于为随机数生成器提供种子,以防止生成相同的随机数序列。同样,我知道 getpid()“应返回调用进程的进程 ID。” ( http://pubs.openg
#include #include #include #include int main(int argc, char **argv) { printf ("%d", getpid()
当我运行下面的代码时 #include #include //int i=0; int main(){ int id ; id = fork() ; printf("id value : %d\n
我在程序中多次调用getpid()(为了测试系统调用的效率),但是当我使用strace要获取跟踪,只捕获一个 getpid() 调用。 代码很简单: #include #include #incl
我刚刚安装了 Android Studio,我从 SDK 管理器安装了推荐的包,现在我正在尝试构建一个示例应用程序。我收到此错误消息: Failed to complete Gradle execut
新来的。我正在尝试制作一个 c++ 程序,它将从 python 创建的命名管道中读取。我的问题是,python 创建的命名管道使用 os.getpid() 作为管道名称的一部分。当我尝试从 C++ 调
根据手册页 getpid() returns the process ID (PID) of the calling process. 在下面的代码中,为什么 parent pid 返回的值与 get
如果我有如下字符串: char* exampleString = "test$$"; 假设 getpid() 返回 1587。 如何用 getpid() 的结果替换字符串中的 $$,使结果成为字符串
假设您处于单线程进程中,并且相关信号未被阻塞或忽略,是否可以保证: kill(getpid(), sig); 是否会导致在执行下一行代码之前传递信号? 特别是,如果信号是一个没有处理程序的信号,并且整
/* In alarm.c, the first function, ding, simulates an alarm clock. */ #include #include #include
我是一名优秀的程序员,十分优秀!