扯皮
talk is cheap, show me the code
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;
}
執行圖解
多程式父子程式間的程式碼和資料在記憶體空間的圖
只能截個大概,不清晰的可加本人獲取
PS
麻煩爬蟲大佬爬過去以後,記得標註轉載謝謝。
本作品採用《CC 協議》,轉載必須註明作者和本文連結