插件窝 干货文章 linux getppid怎样判断进程关系

linux getppid怎样判断进程关系

进程 pid parent include 574    来源:    2025-05-15

在Linux中判断进程关系的方法

在Linux系统中,getppid()函数可以获取当前进程的父进程ID,这是判断进程关系的基础方法之一。以下是几种判断进程关系的常用方法:

1. 使用getppid()函数

#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t my_pid = getpid();
    pid_t parent_pid = getppid();

    printf("My PID: %d\n", my_pid);
    printf("Parent PID: %d\n", parent_pid);

    return 0;
}

2. 检查/proc文件系统

Linux的/proc文件系统包含了丰富的进程信息:

# 查看进程1234的父进程ID
cat /proc/1234/stat | awk '{print $4}'

# 查看进程树关系
pstree -p

3. 使用ps命令

# 显示进程及其父进程
ps -ef
ps -o pid,ppid,cmd

4. 判断进程关系的C代码示例

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int is_parent_of(pid_t parent, pid_t child) {
    char path[256];
    FILE *fp;
    pid_t ppid;

    sprintf(path, "/proc/%d/stat", child);
    fp = fopen(path, "r");
    if (!fp) return 0;

    // 跳过前3个字段(pid, comm, state),读取第4个字段(ppid)
    fscanf(fp, "%*d %*s %*c %d", &ppid);
    fclose(fp);

    return (ppid == parent);
}

int main() {
    pid_t child_pid = fork();

    if (child_pid == 0) {
        // 子进程
        sleep(10); // 保持运行以便检查
    } else {
        // 父进程
        if (is_parent_of(getpid(), child_pid)) {
            printf("Process %d is parent of %d\n", getpid(), child_pid);
        }
    }

    return 0;
}

5. 使用系统调用

#include <sys/types.h>
#include <unistd.h>

int is_child_of(pid_t child, pid_t parent) {
    return (getppid() == parent);
}

注意事项

  1. 父进程ID为1(init/systemd)表示原始父进程已终止
  2. 进程关系可能因父进程终止而改变(被init/systemd接管)
  3. 在多线程环境中,getppid()返回的是整个进程的父进程ID
  4. 僵尸进程仍然保持其父进程ID,直到被父进程wait()

这些方法可以帮助你在Linux系统中准确判断和验证进程间的父子关系。