你是否真的懂 [程序的運行順序] 多進程 / 進程池

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架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)圖標

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章