1. 程式人生 > >system函式分析

system函式分析

windows中的情況也類似,就是execl換了個又臭又長的名字,引數名也換的看了讓人發暈的,我在MSDN中找到了原型,給大家看看:
HINSTANCE   ShellExecute(
               HWND  hwnd,
               LPCTSTR  lpVerb,
               LPCTSTR  lpFile,
               LPCTSTR  lpParameters,
               LPCTSTR  lpDirectory,
               INT  nShowCmd
   );   

用法如下:  
    ShellExecute(NULL,   "open",  "c:\\a.reg",   NULL,   NULL,  SW_SHOWNORMAL);   
你也許會奇怪 ShellExecute中有個用來傳遞父程序環境變數的引數 lpDirectory,linux中的execl卻沒有,這是因為execl是編譯器的函式(在一定程度上隱藏具體系統實現),在linux中它會接著產生一個linux系統的呼叫execve, 原型見下:
    int execve(const char * file,const char **argv,const char**envp);
看到這裡你就會明白為什麼system()會接受父程序的環境變數,但是用system改變環境變數後,system一返回主函式還是沒變,這就是我在22樓反覆強調的。原因從system的實現可以看到,它是通過產生新程序實現的,從我的分析中可以看到父程序和子程序間沒有程序通訊,子程序自然改變不了父程序的環境變數。希望小菜們不要拿tc或使用tc庫的其他編譯器中的system的呼叫結果來反駁我,這不是一個概念,DOS早死翹翹了,玩linux吧。就說到這裡了。

我在bc-cn混了這麼久威望精華還都是0,今天寫到手抽筋,沒功勞也有苦勞,沒苦勞還有疲勞,版主給我加個精,要不我以後還是去水區灌水算了