C++ getpid() 与 syscall(39)?

C++ getpid() vs syscall(39)?

我读到系统调用(39) returns 当前进程 ID (pid)

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

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,这是为什么?

这里遗漏了一个关键细节 -- 每次您 运行 程序时,您的 OS 都会为其分配一个新的 PID。连续两次调用同一个程序可能 return 不同的 PID - 所以你所描述的不是测试 getpid()syscall(39).[=13 之间差异的好方法=]

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

#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;
}

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

确实,我们看到 39 在 macOS 上是 getpid on Linux, but getppid(“获取父 pid”)。

getpid 在 macOS 上是 20。

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

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