fork process

#include <stdlib.h>
#include <unistd.h>
#include <iostream>
using namespace std;
class fork_process {
public:
    static inline fork_process &get() {
        static fork_process obj;
        return obj;
    }
    void fork_now(int process_num) {
        if (process_num <= 1 || process_num > MAX_PROCESS_NUM) {
            return;
        }
        int parent_id = 0;
        pid_t pid = fork();
        if (pid < 0) {
            return;
        }
        if (pid > 0) {
            parent_id = getpid();
        }
        else {
            // fork a child to do something
        }
        for (int i = 2;i < process_num;++i) {
            if (getpid() != parent_id) {
                continue;
            }
            pid = fork();
            if (pid < 0) {
                exit(EXIT_FAILURE);
            }
            if (0 == pid) {
                // fork a child to do something
            }
        }
    }
private:
    fork_process() = default;
    ~fork_process() = default;
private:
    static const int MAX_PROCESS_NUM = 100;

};
int main(int argc, const char **argv) {
    if (argc >= 2) {
        fork_process::get().fork_now(atoi(argv[1]));

    }
    cout << "process begin to work now." << endl;
    while (true) {
        sleep(1000);
    }

    return 0;
}

 

### 什么是Fork在编程和版本控制中的定义 #### 在操作系统领域 `fork` 是一种系统调用,用于创建一个新的进程。新进程被称为子进程,而发起 `fork` 调用的进程则成为父进程[^1]。通过这个机制,操作系统可以复制当前进程的所有内存空间、文件描述符以及其他资源给新的子进程。然而,父子进程之间共享某些属性,比如打开的文件描述符列表,但也有独立的部分,例如各自的 PID 和堆栈。 具体来说,在 Linux 系统中,`struct task_struct` 数据结构用来表示每一个用户态进程的信息,它包含了诸如进程状态 (`state`)、堆栈指针 (`stack`)、PID 号码 (`pid`)、地址空间指向器 (`mm`) 等重要字段[^1]。当执行 `fork()` 函数时,实际上就是在内核层面构建了一个几乎完全相同的副本,并将其加入到系统的调度队列之中。 #### 在版本控制系统(VCS)如 Git 中的应用场景 而在软件开发特别是协作项目管理方面,“fork”的概念也被广泛应用于版本控制系统当中,像 GitHub 或者 GitLab 平台上的仓库克隆行为就是典型例子。这里所说的 “fork”,指的是开发者基于某个现有的开源项目的原始代码库建立自己的一份分支拷贝[^3]。这样做的好处在于允许个人或者团队能够在不影响原作者工作的前提下自由实验、改进甚至重构该项目的内容;如果最终成果值得分享,则可通过提交 Pull Request 的方式请求合并回主干工程里去。 这种做法极大地促进了开放源代码社区的成长壮大,因为它降低了参与贡献的技术门槛——即使是没有权限直接编辑官方存储库的人也可以轻松参与到感兴趣的项目维护工作中来。 ```python import os def create_child_process(): pid = os.fork() if pid < 0: print("Failed to fork process.") elif pid == 0: # Child Process Code Path print(f"I am the child with PID: {os.getpid()}") else: # Parent Process Code Path print(f"Fork successful! My PID is {os.getpid()} and my child's PID is {pid}.") create_child_process() ``` 上面展示了一段简单的 Python 实现模拟 Unix/Linux 下 C 风格的 `fork()` 功能片段。可以看到,根据返回值的不同我们可以区分是在哪个进程中运行相应的逻辑部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值