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

更新 2:

非常感謝Jacob Lee大的協助

若您願意,在下建議把這些資料放進回答

因為1992代表handle已經有回答到當初發問時候的問題點

更新 3:

Jacob Lee大:

意見中您說無GetPid(HND)

但process.h裡有getpid()且出現於回答code

那請問它所給的是何者的pid? (parent/child)

且觀察這些code, 想終止process

是否就用getpid(標準process.h)配合非標準MSDN?

更新 4:

那麼綜合之前內容:

(1) spawn傳回HND; getpid(uoid)傳回自己的pid (pid_t)

(2) TerminateProcess可直接以spawn所得HND來終止

(3) GetProcInfo可從HND轉pid,實現DevCpp沒有的getpid(HND),

及取得其他相關資料

這樣的結論有沒有符合所有回答與意見?

希望往後參考者能從這些結論快速理解這題問答內容

1 個解答

評分
  • ?
    Lv 7
    10 年前
    最愛解答

    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&nbsp; = 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留一手!)

    因此,可能只能這麼麻煩。

還有問題嗎?立即提問即可得到解答。