使用fork系统调用创建进程

fork系统调用

  • fork系统调用用于创建进程
  • fork创建的进程初始化状态与父进程一样(对于进程有进程空间,包括内存以及内核态等,初始化时一模一样,包括他们拥有的变量、逻辑空间等)
  • 系统为fork进程分配新的资源(包括CPU、内存资源等)

fork系统调用没有参数,fork调用一次会返回两次,分别是子进程id是父进程,返回的0是子进程。返回两次是因为当时有fork系统调用的时候,子进程初始化和父进程一模一样,子进程也拥有fork的逻辑,所以会返回两次。第一次由父进程所返回,第二次由子进程所返回。

fork_demo

//
// Created by 文若 on 2020/9/5.
//

#include <iostream>
#include <unistd.h>

using namespace std;

int main() {
    // 定义进程id
    pid_t pid;
    int num = 666;
    pid = fork();

    // 对返回进行判断
    if (pid == 0) {
        cout << "这是一个子进程||";
        cout << "子进程中的num:" << num << endl;
        for (int i = 0; i < 5; ++i) {
            num += 1;
            cout << num << " ";
        }
    } else if (pid > 0) {
        cout << "这是一个父进程||" << "子进程id" << pid << "||父进程中的num:" << num << endl;
        for (int i = 0; i < 5; ++i) {
            num -= 1;
            cout << num << " ";
        }
        cout << endl;
    } else {
        cout << "创建进程失败" << endl;
    }
    return 0;
}


输出结果:

这是一个父进程||子进程id2926||父进程中的num:666
665 664 663 662 661 
这是一个子进程||子进程中的num:666
667 668 669 670 671 

打印结果分析

  1. 虽然进行了条件判断,仍旧输出了父进程和子进程两种情况,说明fork函数确实返回两次。
  2. num的初始值在父进程和子进程中一样,说明了fork调用初始化状态一模一样
  3. 但是子进程不继承父进程,可以看到父子进程分别对num进行不同的逻辑操作,他们的运算结果也是不同的。

猜你喜欢

转载自blog.csdn.net/wankcn/article/details/108414783