日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Windows 2000系統(tǒng)編程——進(jìn)程的創(chuàng)建( 三 )


① 調(diào)用 GetExitCodeProcess
命令 GetExitCodeProcess 既能返回 STILL_ACTIVE , 也能返回進(jìn)程退出值(如果進(jìn)程結(jié)束時(shí))返回值需要一個(gè)指針 , 其指向命令填充的變量 。
② 調(diào)用 WaitForSingleObject
WaitForSingleObject 的目的是要確定句柄是否處于發(fā)送信號(hào)的狀態(tài) 。當(dāng)進(jìn)程結(jié)束時(shí) , 進(jìn)程句柄發(fā)出信號(hào) 。當(dāng)調(diào)用 WaitForSingleObject 時(shí) , 就規(guī)定進(jìn)程句柄和超時(shí)值 , 如果超時(shí)為 0 , 則該命令就立刻返回 , 且能夠確定進(jìn)程的狀態(tài) 。如果超時(shí)是常數(shù) INFINITE , 則命令就不返回 , 直到目標(biāo)進(jìn)程退出為止 。當(dāng)然 , 還可以規(guī)定超時(shí)值 , 其導(dǎo)致該命令等待要結(jié)束的進(jìn)程一段時(shí)間 。如果進(jìn)程在超時(shí)屆滿(mǎn)前結(jié)束 , 該命令就返回 , 并指出句柄在發(fā)射信號(hào)狀態(tài) 。否則 , 就返回一個(gè)負(fù)值 。不管句柄在何種狀態(tài) , WaitForSingleObject 將成功返回 , 沒(méi)有錯(cuò)誤發(fā)生 。要確定進(jìn)程的狀態(tài) , 就必須比較返回值為 WAIT_OBJECT_0 (已發(fā)信號(hào)的)和 WAIT_TIMEOUT (未發(fā)信號(hào)的) 。真正的錯(cuò)誤返回值為 WAIT_FAILED。另外可能的返回值是 WAIT_ABANDONED , 是不會(huì)看到何時(shí)處理進(jìn)程 。要等待一個(gè)進(jìn)程 , 就必須帶有 SYNCHRONIZE 特權(quán)的打開(kāi)局柄 。
這里要注意 , 進(jìn)程 ID 與進(jìn)程句柄不同 。不能簡(jiǎn)單地在進(jìn)程之間傳送句柄 , 這意味著除非有句柄 , 否則不能從外部進(jìn)程直接操縱一個(gè)進(jìn)程 。不過(guò) OpenProcess 命令將允許任何程序(有足夠的安全特權(quán))將進(jìn)程標(biāo)示符(可以用來(lái)于其它進(jìn)程通信)變換為進(jìn)程句柄 。通過(guò)調(diào)用 GetCurrentProcessId , 還可以了解當(dāng)前進(jìn)程標(biāo)示符 。如果要想與其他無(wú)關(guān)的進(jìn)程共享 , 以使能夠打開(kāi)進(jìn)程句柄 , 這是非常有用的 。但調(diào)用 OpenProcess 時(shí) , 可以請(qǐng)求對(duì)進(jìn)程的訪(fǎng)問(wèn) 。對(duì)每種進(jìn)程的訪(fǎng)問(wèn) , 也許有或也許沒(méi)有訪(fǎng)問(wèn)要打開(kāi)進(jìn)程的安全性 , 于是試圖請(qǐng)求是僅僅需要的 。例如 , 如果要了解進(jìn)程的返回代碼 , 就需要 PROCESS_QUERY_INFORMATION 的訪(fǎng)問(wèn) 。要終止進(jìn)程 , 就必須有 PROCESS_TERMINATE 的訪(fǎng)問(wèn) 。
⑸ 程序示例
下面通過(guò)一個(gè)例子來(lái)說(shuō)名 CreateProcess 和相關(guān)命令的使用 。下面程序是兩個(gè)簡(jiǎn)單的控制臺(tái)應(yīng)用程序 , 第一個(gè)程序( MASTER )運(yùn)行第二個(gè)程序( SLAVE ) , 并進(jìn)入睡眠 。SLAVE 程序從命令行讀取源程序的進(jìn)程 ID(PID), 并等待 MASTER 程序終止 。這些程序說(shuō)明了以下幾個(gè)重要技術(shù):
l 使用 CreateProcess
l 使用 OpenProcess
l 使用 WaitForSingleObject
程序清單 MASTER 程序
#include
#include
#include
#include
void main(int argc,char *argv[])
{
char cmd[128];
if (argc!=1)
strcpy(cmd,argv[1]);
else
strcpy(cmd,”slave.exe”);
int pid=GetCurrentProcessId();
sprintf(cmd strlen(cmd),” %d”,pid);
cout<<”Master: Starting:”< cout.flush();
STARTUPINFO info;
memset(&info,0,sizeof(info));
info.cb=sizeof(info);
PROCESS_INFORMATION pinfo;
If(!CreateProcess(NULL,cmd,NULL,NULL,FALSE{
c out<<”Master:Slave process did not startn”;
c out<<” Master:Try naming slave process on the command linen”;
}
cout<<”Master:Sleepingn”;
cout.flush();
Sleep(15000);
Cout<<”Master:Exitingn”;
exit(0);
}
程序清單 SLAVE 程序
#include
#include
#include
void main(int argc,char *argv[])
{
if (argc!=2)
{
cout<<”Slave:Please rrun MASTER.EXE instead.n”;
exit(1);
}
int pid=atoi(argv[1]);
HANDLE process=OpenProcess(PROCESS_QUERY_INFORMATION|SYNCHRONIZE,FALSE,pid);
if (!process) cot<<”Slave:Error opening processn”;
cout<<”Slave :Waiting for master to finishn”;

推薦閱讀