Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
process.h的spawn回傳1992代表什麼意思?
各位大大:
在下剛接觸spawn, 寫了兩個城市進行測試
// a.cpp
#include
#include
int m ain(int argc, char* argv[]){
int r=spawnv(P_NOWAIT, "./c.exe", argv);
printf("%d ", r);
return 0;
}
// c.cpp
#include
int main(int argc, char* argv[]){
long endwait=clock()+2000L;
while(clock()
return 0;
}
a.cpp和c.cpp各產生a.exe, c.exe在同目錄下
使用command line 執行,發現結果為1992
%`cpp以Sleep(2000)改寫結果相同
請問1992有何意義?或如何修改可以使它回傳0?
(在下用Dev-C++編譯)
3Q
先感謝Jacob Lee大指點
請問Jacob Lee或其他大大
用什麼方法可利用此handle檢查該process的狀態
(NEW, READY, RUNNING, WAITING, TERMINATED)
以及終止它?知道的大大可直接寫在回答~3Q
非常感謝Jacob Lee大的協助
若您願意,在下建議把這些資料放進回答
因為1992代表handle已經有回答到當初發問時候的問題點
Jacob Lee大:
意見中您說無GetPid(HND)
但process.h裡有getpid()且出現於回答code
那請問它所給的是何者的pid? (parent/child)
且觀察這些code, 想終止process
是否就用getpid(標準process.h)配合非標準MSDN?
那麼綜合之前內容:
(1) spawn傳回HND; getpid(uoid)傳回自己的pid (pid_t)
(2) TerminateProcess可直接以spawn所得HND來終止
(3) GetProcInfo可從HND轉pid,實現DevCpp沒有的getpid(HND),
及取得其他相關資料
這樣的結論有沒有符合所有回答與意見?
希望往後參考者能從這些結論快速理解這題問答內容
1 個解答
- ?Lv 710 年前最愛解答
P_NOWAIT 時,傳回值是 process handle,你得到的是 1992。
要它是0,你要用 P_WAIT,它會傳回 c.cpp 的 return 值。
2011-09-06 21:34:26 補充:
要注意的是 Process Handle 不是 Process ID!
好像沒有標準的方法。
即使是非標準,我沒找到直接使用 HND 的方法!
要Ternimated,用
TerminateProcess(hnd, 0);
MSDN 有一些非標準!
因為 spawn 傳回的是 HND,不是 pid,
也沒有標準的 GetPid(HND);
而我找到的非標準又全是用 pid 不是 HND!
偏偏 Dev 4992 不支援 GetProcessId(hnd)!
2011-09-06 21:34:56 補充:
以下是在 VSC 2003 在 XP 下執行
Yahoo 叫 Sleep後,
查 Sleep by Name 再 by HND 後,
terminate Sleep,再 by HND
用 pid 查 Yahoo
的情況。
PROCESS NAME: Sleep.exe
Process ID = 0x00000BCC 3020
Thread count = 1
Priority base = 8
Priority class = 32
Parent process ID = 0x00000928
2011-09-06 21:35:15 補充:
PROCESS NAME: Sleep.exe
Process ID = 0x00000BCC 3020
Thread count = 1
Priority base = 8
Priority class = 32
Parent process ID = 0x00000928
Can not find Process ID 3020
2011-09-06 21:35:24 補充:
PROCESS NAME: Yahoo.exe
Process ID = 0x00000928 2344(, 2344)
Thread count = 1
Priority base = 8
Priority class = 32
Parent process ID = 0x00000840
2011-09-07 06:12:03 補充:
先參意見,這裡放程式。
#include <windows.h>
#if 0
int main(int argc, char *argv[])
{ argc = argc >= 1 ? atoi(argv[1]) : 10;
printf("Before sleep %d seconds\n", argc); fflush(stdout);
Sleep(argc*1000);
printf("After wake up from %d seconds.\n", argc); fflush(stdout);
}
#else
#include <process.h>
#include <stdio.h>
#include <TlHelp32.h>
int GetProcInfo(unsigned pid, int flags=0);
int GetProcInfo(HANDLE hnd, int flags=0);
int GetProcInfo(char *pName, int flags=0);
#define PROCINFO_LIST_PARENT 1
int main(void)
{ HANDLE hnd; hnd = (HANDLE) spawnl(_P_NOWAIT, "Sleep.exe", "Sleep.exe", "5", NULL);
// Sleep(125);
GetProcInfo("Sleep.exe");
if (hnd >= 0)
{ GetProcInfo(hnd);
TerminateProcess(hnd, 0);
Sleep(50); // wait for context switch so that hnd has really been terminated
GetProcInfo(hnd);
} else
printf("Fail to spawn a child process.\nError: %d\a\n", (int) hnd); GetProcInfo(getpid()); system("pause");
return 0;
}
int GetProcInfo(unsigned pid, int flags)
{ HANDLE hnd;
PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); hnd = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32First(hnd, &pe32);
while (pe32.th32ProcessID != pid && Process32Next(hnd, &pe32));
CloseHandle(hnd); if (pe32.th32ProcessID != pid)
printf("Can not find Process ID %d\a\n", pid);
else // 去掉else並把HND cast成pid來跑試試!
{ hnd = OpenProcess(PROCESS_ALL_ACCESS, false, pe32.th32ProcessID); printf("PROCESS NAME: %s\n", pe32.szExeFile);
printf("Process ID\t\t= 0x%08X %d(, %d)\n", pe32.th32ProcessID, pe32.th32ProcessID, pid);
printf("Thread count\t\t= %d\n", pe32.cntThreads);
printf("Priority base\t\t= %d\n", pe32.pcPriClassBase);
{ DWORD dwPriorityClass = GetPriorityClass(hnd);
if (dwPriorityClass)
printf("Priority class\t\t= %d\n", dwPriorityClass);
}
printf("Parent process ID\t= 0x%08X\n", pe32.th32ParentProcessID);
CloseHandle(hnd);
} if (flags & PROCINFO_LIST_PARENT && pe32.th32ParentProcessID == (unsigned)getpid())
GetProcInfo(pe32.th32ParentProcessID);
接意見
2011-09-07 06:18:00 補充:
putchar('\\n');
return 0;
}
// = = = =
int GetProcInfo(HANDLE hnd, int flags)
{ return GetProcInfo(GetProcessId(hnd), flags); } // Dev C 4992 不支援
// = = = =
int GetProcInfo(char *pName, int flags)
{ HANDLE hnd;
PROCESSENTRY32 pe32;
2011-09-07 06:18:11 補充:
pe32.dwSize = sizeof(PROCESSENTRY32);
hnd = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32First(hnd, &pe32);
while (strcmp(pe32.szExeFile, pName) && Process32Next(hnd, &pe32));
CloseHandle(hnd);
return GetProcInfo(pe32.th32ProcessID, flags);
}
#endif
有問題請補問。 ^_^
2011-09-08 20:47:52 補充:
process.h 裡的是 getpid( VOID );
不是 getpid( HND );
它只能傳會自己的 PID,不能傳回指定的 Process Handle 的 PID
而 TernimateProcess 沒找到 pid 版,只有 HND 版!
所以,才會有我說的那些問題。
除非能有 undocument 的東東,或自己寫個轉換程式。
(如:意見 6, 7 那兩個 GetProcInfo 都是)
2011-09-08 21:01:11 補充:
不過,undocument 的東西最好不要用!
尤其是 M$ 的 OS 的 undoc.,真的要問上帝!
這東東確實有hidden doc 的東,且明說:不要用!
2011-09-09 07:29:49 補充:
回答 2011-09-08 22:52:14 的補充發問:
(1) Y spawn傳回HND; getpid(uoid)傳回自己的pid (pid_t)
(2) Y TerminateProcess可直接以spawn所得HND來終止
(3) y GetProcInfo可從HND轉pid,實現DevCpp沒有的getpid(HND),
如果 OS 有建表的話,可以直接由 pid 或 HND 查表得到需要的資料。
由 MSDN 的 範例要像意見007或回答中的 GetProgInfo 一個一個查下去來看,
M$ 的 OS 沒有建表!(除非MSDN留一手!)
因此,可能只能這麼麻煩。