zoukankan      html  css  js  c++  java
  • 你是否真的懂 [程序的运行顺序] 多进程 / 进程池

    linux 如何运行一个程序

    linux 在运行任何程序之时,都要调用 execve 系统调用函数,然后把你的程序和你给的参数以及环境参数扔给程序的入口函数。

    入口函数

    php【php 脚本依赖 php 解释器】解释器运行,源码就是 c【真是废话,谁不知道,用我来逼逼半天】入口函数就是 main【如 mysql,redis,php,nodejs,python,memcached,apache 等】

     

    该程序的代码,数据容量

     

    测试源码

    不管什么语言的源码【不必在意语言】,道理都一样的

    class demo
    {
    public:
            demo(int age,char *name):m_age(age),m_name(name){}
            void run();
            void child();
            void parent();
    public:
            int m_age;
            char *m_name;
            pid_t pid;
            int num[3];
    };
    
    void demo::child()
    {
            printf("child run %d==%d=%d
    ",getpid(),pid,m_age);
            while(1){
                    sleep(1);
                    printf("child run %d=%d=%d
    ",getpid(),pid,m_age);
                    printf("我要访问demo类成员的数据
    ");
                    printf("demo::m_name=%s
    ",m_name);
                    printf("demo::m_age=%d
    ",m_age);
                    printf("demo::pid=%d
    ",pid);
                    for(int i=0;i<3;i++){
                            printf("demo::num[%d]=%d
    ",i,num[i]);
                    }
            }
    
    }
    
    void demo::parent()
    {
            printf("parent run %d=%d=%d
    ",getpid(),pid,m_age);
            while(1){
                    sleep(1);
                    printf("parent run %d=%d=%d
    ",getpid(),pid,m_age);
                    printf("我要访问demo类成员的数据
    ");
                    printf("demo::m_name=%s
    ",this->m_name);
                    printf("demo::m_age=%d
    ",this->m_age);
                    printf("demo::pid=%d
    ",this->pid);
                    for(int i=0;i<3;i++){
                            printf("demo::num[%d]=%d
    ",this->num[i]);
                    }
            }
    }
    void demo::run()
    {
            cout<<"main process "<<getpid()<<" start"<<endl;
            m_age=0;
            for(int i=0;i<3;i++){
                    num[i] = i;//父进程可访问全部的值  123
                    pid = fork();//复制之时,子进程是得不到pid的内容的,而父亲运行时是返回它自己  所以一直不变
                    if(pid>0){
                            continue;
                    }
                    else if(pid==0){
                            m_age=i+1;
                            break;
                    }
            }
    
    
    }
    int main()
    {
            demo *obj = new demo(100,(char*)"jack");
            obj->run();
            if(obj->m_age){
                    obj->child();
            }else{
                    obj->parent();
            }
            return 0;
    }
    

    运行图解

     

     

     

    多进程父子进程间的代码和数据在内存空间的图

    只能截个大概

     

     

     

     

     

     

     

     

    更多PHP内容请访问:

    腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)图标
  • 相关阅读:
    Android进阶之关闭所有activty
    弹出窗口插件欣赏
    关于之前放在google 的资源不能下载的解决方案
    图片垂直居中的使用技巧
    关于采用业务用例视图来展示、归纳、整理业务用例的三点指导原则
    操作系统引导的那点事
    可视化拾色器
    AE中删除属性字段
    AE中添加属性字段
    vs2005c#中用户组件在工具箱中不能自动出现的解决办法
  • 原文地址:https://www.cnblogs.com/a609251438/p/12987759.html
Copyright © 2011-2022 走看看