首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 跨平台进程管理类:基于 POSIX spawn 实现

     編輯:關於C++

简介

在 C++ 开发中,进程创建与管理是系统编程的核心需求。标准库未提供统一的跨平台进程接口,开发者常需直接调用平台 API。本文介绍一个轻量级的 C++ 封装类 POSIX_PROCESS,基于 POSIX posix_spawn 系列函数实现,支持属性配置、文件动作控制,适用于 Linux/Unix 环境下的进程启动与同步。

核心设计

类结构

类结构图

POSIX_PROCESS 封装了进程标识符(pid_t)、spawn 属性(posix_spawnattr_t)、文件动作(posix_spawn_file_actions_t)以及程序路径、参数、环境变量。提供两个构造函数:基础版自动初始化属性,高级版允许外部传入预配置的属性对象。

关键接口

  • run():调用 posix_spawn 创建子进程
  • join(int& value):阻塞等待子进程结束,获取退出状态

完整实现代码

1. 头文件 posix_process.h

/*************************************************************************
> File Name: posix_process.h
> Author: wangzhicheng
> Mail: 2363702560@163.com
> Created Time: Thu 12 Feb 2015 07:35:34 PM WST
************************************************************************/

#ifndef POSIX_PROCESS_H
#define POSIX_PROCESS_H

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <spawn.h>
#include <sys/wait.h>
#include <errno.h>
#include <iostream>
#include <string>

using namespace std;

class POSIX_PROCESS {
protected:
    pid_t mPid;
    posix_spawnattr_t mSpawnattr;
    posix_spawn_file_actions_t mFileactions;
    char **mArgv;
    char **mEnvp;
    string mProgram_path;

public:
    POSIX_PROCESS(const string &program_path, char **argv, char **envp);
    POSIX_PROCESS(const string &program_path, char **argv, char **envp,
                  posix_spawnattr_t &X, posix_spawn_file_actions_t &Y);
    void run(void);
    void join(int &value);
};

#endif

2. 实现文件 posix_process.cpp

/*************************************************************************
> File Name: posix_process.cpp
> Author: wangzhicheng
> Mail: 2363702560@163.com
> Created Time: Thu 12 Feb 2015 07:50:36 PM WST
************************************************************************/

#include "posix_process.h"

POSIX_PROCESS::POSIX_PROCESS(const string &program_path, char **argv, char **envp) {
    this->mArgv = argv;
    this->mEnvp = envp;
    this->mProgram_path = program_path;
    posix_spawnattr_init(&this->mSpawnattr);
    posix_spawn_file_actions_init(&this->mFileactions);
}

POSIX_PROCESS::POSIX_PROCESS(const string &program_path, char **argv, char **envp,
                             posix_spawnattr_t &X, posix_spawn_file_actions_t &Y) {
    this->mArgv = argv;
    this->mEnvp = envp;
    this->mProgram_path = program_path;
    this->mSpawnattr = X;
    this->mFileactions = Y;
    posix_spawnattr_init(&this->mSpawnattr);
    posix_spawn_file_actions_init(&this->mFileactions);
}

void POSIX_PROCESS::run(void) {
    posix_spawn(&this->mPid, this->mProgram_path.c_str(),
                &this->mFileactions, &this->mSpawnattr,
                this->mArgv, this->mEnvp);
}

void POSIX_PROCESS::join(int &value) {
    wait(&value);
}

3. 调度器示例 schedule.cpp

/*************************************************************************
> File Name: schedule.cpp
> Author: wangzhicheng
> Mail: 2363702560@qq.com
> Created Time: Thu 12 Feb 2015 08:01:44 PM WST
************************************************************************/

#include "posix_process.h"

int main(int argc, char **argv, char **envp) {
    string program_path;
    cin >> program_path;
    POSIX_PROCESS process(program_path, argv, envp);
    int value;
    process.run();
    process.join(value);
    return 0;
}

4. 编译脚本 Makefile

CC=g++
all:
	$(CC) -g -o main schedule.cpp posix_process.cpp posix_process.h

运行效果演示

程序运行截图

设计要点总结

  • RAII 原则:构造函数初始化属性对象,析构时应补充 posix_spawnattr_destroy 与 posix_spawn_file_actions_destroy(原代码未显式释放,生产环境需完善)
  • 异常安全:posix_spawn 失败时可通过 errno 获取错误码,建议封装异常抛出
  • 扩展性:预留属性与文件动作的外部注入接口,支持信号掩码、调度策略、文件描述符重定向等高级场景

适用场景

适用于需要精细控制子进程启动参数(如文件描述符继承、信号处理、用户/组 ID 切换)的服务端程序、任务调度器、沙箱执行器等场景。相比 fork+exec,posix_spawn 在多线程环境下更安全、性能更优。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved