你是否真的懂 [程序的运行顺序] 多进程 / 进程池

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\n",getpid(),pid,m_age);
        while(1){
                sleep(1);
                printf("child run %d=%d=%d\n",getpid(),pid,m_age);
                printf("我要访问demo类成员的数据\n");
                printf("demo::m_name=%s\n",m_name);
                printf("demo::m_age=%d\n",m_age);
                printf("demo::pid=%d\n",pid);
                for(int i=0;i<3;i++){
                        printf("demo::num[%d]=%d\n",i,num[i]);
                }
        }

}

void demo::parent()
{
        printf("parent run %d=%d=%d\n",getpid(),pid,m_age);
        while(1){
                sleep(1);
                printf("parent run %d=%d=%d\n",getpid(),pid,m_age);
                printf("我要访问demo类成员的数据\n");
                printf("demo::m_name=%s\n",this->m_name);
                printf("demo::m_age=%d\n",this->m_age);
                printf("demo::pid=%d\n",this->pid);
                for(int i=0;i<3;i++){
                        printf("demo::num[%d]=%d\n",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架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)图标

 

 

posted @ 2020-05-29 15:38  八重樱  阅读(293)  评论(0编辑  收藏  举报