簡體   English   中英

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

[英]C++ getpid() vs syscall(39)?

我讀到 syscall(39) 返回當前進程 id (pid)

那為什么這 2 個程序 output 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,這是為什么呢?

通過他們的號碼進行系統調用是不可移植的。

事實上,我們看到 39 在 Linux 上是getpid ,但在 macOS 上是getppid (“get parent pid”)。

macOS 上的getpid是 20。

這就是為什么您在 macOS 上看到getpid()syscall(39)之間結果不同的原因。

請注意,作為 BSD kernel 衍生品的 macOS 與 Linux 沒有任何關系。 不可能,因為它是閉源的。

這里缺少一個關鍵細節——每次運行程序時,操作系統都會為其分配一個新的 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM