21xrx.com
2025-03-31 08:07:59 Monday
文章检索 我的文章 写文章
Linux C++:获取当前进程的所有子进程
2023-07-13 20:16:51 深夜i     172     0
Linux C++ 子进程 获取 当前进程

在 Linux 系统中,进程可以通过 fork() 系统调用创建子进程。父进程和子进程是一个树形结构,其中每个进程都有一个父进程,除了初始进程(进程 ID 是 1)。

在某些情况下,需要获取当前进程的所有子进程。本篇文章将介绍如何在 Linux C++ 程序中实现这个功能。

1. 调用 getppid() 函数获取父进程 ID

在 Linux C++ 程序中,可以使用 getppid() 函数获取当前进程的父进程 ID。因此,获取当前进程的所有子进程的第一步是获取当前进程的父进程 ID。

例如,下面的代码片段演示了如何获取当前进程的父进程 ID:

#include <unistd.h>
#include <iostream>
int main() {
  pid_t parent_pid = getppid();
  std::cout << "Parent process ID: " << parent_pid << std::endl;
  return 0;
}

2. 遍历所有进程,判断它们的父进程 ID 是否等于当前进程的 ID

在 Linux 系统中,可以使用 proc 文件系统获取所有进程的信息。每个进程都有一个以其进程 ID 命名的目录,其中包含一些文件,可以用来获取进程的信息。

因此,获取当前进程的所有子进程的第二步是遍历 proc 文件系统中的所有进程,并判断它们的父进程 ID 是否等于当前进程的 ID。如果是,那么这个进程就是当前进程的子进程。

下面的代码片段演示了如何遍历 proc 文件系统中的所有进程,并输出所有子进程的进程 ID:

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {
  pid_t parent_pid = getpid();
  printf("Parent process ID: %d\n", parent_pid);
  DIR* proc_dir = opendir("/proc");
  if (proc_dir == NULL) {
    perror("opendir");
    exit(1);
  }
  struct dirent* dir_entity;
  while ((dir_entity = readdir(proc_dir)) != NULL) {
    char* dir_name = dir_entity->d_name;
    // Ignore non-numeric directory names
    if (!isdigit(*dir_name))
      continue;
    
    char proc_path[256];
    snprintf(proc_path, sizeof(proc_path), "/proc/%s/status", dir_name);
    FILE* status_file = fopen(proc_path, "r");
    if (status_file == NULL)
      // Process has exited before we could read its status
      continue;
    
    pid_t pid;
    char desc[256];
    while (fscanf(status_file, "%s", desc) != EOF) {
      if (strcmp(desc, "Pid:") == 0) {
        fscanf(status_file, "%d", &pid);
      } else if (strcmp(desc, "PPid:") == 0) {
        pid_t ppid;
        fscanf(status_file, "%d", &ppid);
        if (ppid == parent_pid) {
          printf("Child process ID: %d\n", pid);
        }
        break;
      }
    }
    fclose(status_file);
  }
  closedir(proc_dir);
  return 0;
}

3. 总结

本篇文章介绍了如何在 Linux C++ 程序中获取当前进程的所有子进程。具体来说,这包括两个步骤:首先,使用 getppid() 函数获取当前进程的父进程 ID;然后,遍历 proc 文件系统中的所有进程,判断它们的父进程 ID 是否等于当前进程的 ID。如果是,那么这个进程就是当前进程的子进程。

  
  
下一篇: C++操作注册表

评论区

请求出错了