gpt4 book ai didi

linux - 为什么将getpid实现为系统调用?

转载 作者:太空狗 更新时间:2023-10-29 11:21:21 37 4
gpt4 key购买 nike

我正在上我的第一门操作系统课,所以希望我在这里没有任何大的误解。

我想知道为什么 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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com