system函式分析
阿新 • • 發佈:2019-01-30
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,今天寫到手抽筋,沒功勞也有苦勞,沒苦勞還有疲勞,版主給我加個精,要不我以後還是去水區灌水算了
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,今天寫到手抽筋,沒功勞也有苦勞,沒苦勞還有疲勞,版主給我加個精,要不我以後還是去水區灌水算了