【问题标题】:C++ getpid() vs syscall(39)?C ++ getpid()与系统调用(39)?
【发布时间】:2021-07-29 22:30:20
【问题描述】:

我读到 syscall(39) 返回当前进程 id (pid)

那为什么这两个程序会输出两个不同的数字呢?

int main() {
    long r = syscall(39);
    printf("returned %ld\n", r);
    return 0;
}

和:

int main() {
    long r = getpid();
    printf("returned %ld\n", r);
    return 0;
}

我在 clion 中运行我的程序,当我更改第一行时,我得到了不同的结果,这真的很奇怪。

在我得到的答案中运行代码(在 macos 中):

returned getpid()=9390 vs. syscall(39)=8340

这真的很奇怪。

在 ubuntu 中我得到了相同的 pid,这是为什么呢?

【问题讨论】:

  • 你从每个观察到的具体结果是什么?
  • 这些运行在什么环境下?
  • 您为什么希望它们在每次调用时返回相同的数字?同一程序的不同运行通常会得到不同的 PID。
  • 进程id是在程序启动时由操作系统分配的。同一个程序的不同运行可以有不同的进程ID,不同程序的不同运行也可以。
  • 为什么不在同一个程序/运行中打印两者...?!?

标签: c++ linux macos unix system-calls


【解决方案1】:

通过号码进行系统调用是不可移植的。

确实,我们看到 39 在 Linux 上是 getpid,但在 macOS 上是 getppid(“get parent pid”)。

getpid 在 macOS 上是 20。

这就是为什么您在 macOS 上看到 getpid()syscall(39) 之间的结果不同的原因。

请注意,作为 BSD 内核衍生产品的 macOS 与 Linux 没有任何关系。不可能,因为它是闭源的。

【讨论】:

  • 只是好奇-您在哪里找到了系统调用映射?我只看到这个页面显示 39 is getpid on mac opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/…
  • @GandhiGandhi 你的来源很好,它还说 39 是 getppid,而不是 getpid。
  • @rustyx,可能值得一提的是SYS_foobar定义的存在。
  • 啊哈,棘手的双重 p...@john 这是正确的答案。
【解决方案2】:

这里缺少一个关键细节——每次运行程序时,操作系统都会为其分配一个新的 PID。连续两次调用同一个程序可能会返回不同的 PID - 所以你所描述的并不是测试 getpid()syscall(39) 之间差异的好方法。

这里有一个更好的程序来比较在同一个程序中调用这两个函数的两个函数。

#include <sys/syscall.h>
#include <stdio.h>

int main() {
    long pid1 = getpid();
    long pid2 = syscall(39);
    printf("returned getpid()=%ld vs. syscall(39)=%ld\n", pid1, pid2);
    return 0;
}

【讨论】:

  • 但是当我将程序更改为版本 1 时,它会打印相同的旧 pid1,当我将其更改为版本 2 时会打印 pid2
  • 请看我的更新,现在更清楚了
  • Gotchya- 更清晰的问题。我认为主要原因是syscall() 在操作系统之间不可移植——尽管从这些文档中opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/… 似乎39 也应该等同于MacO 上的getpid()。您能否使用包括#include 行在内的完整源代码再次更新您的问题?
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 2016-02-09
  • 2017-06-24
  • 1970-01-01
  • 2011-08-11
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多