2016-01-12 81 views
0

我有進程名稱,並希望檢查進程是否在HP NonStop OSS中運行。我創建了一個小型C演示程序,但從Guardian PROCESS_GETINFO_過程中得到錯誤。錯誤編號是3. 下面是我的代碼。你能告訴我什麼是問題。檢查進程是否在HP NonStop OSS Tandem中運行

#include <cextdecs.h(PROCESS_GETINFO_)> 

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

short getProcess(const char*); 

enum ZSYSValues 
{ 
ZSYS_VAL_LEN_PROCESSDESCR  = 33 
} ; 

int main() { 

const char* processName = "myProcess"; 
short status = getProcess(processName); 

printf("status = %d", status); 


return 0; 

} 


short getProcess(const char* processName) { 

    short error = 9; 
    short length = 20; 
    short maxLength = ZSYS_VAL_LEN_PROCESSDESCR; 

    /* error: 0 - found; 4 - not found, otherwise - error*/ 
    error = PROCESS_GETINFO_ (/* *processhandle */ 
,(char*) processName 
,maxLength 
,&length 
,/* *priority */ 
,/* *mom’s-processhandle */ 
,/* *hometerm */ 
,/* maxlen */ 
,/* *hometerm-len */ 
,/* *process-time */ 
,/* *creator-access-id */ 
,/* *process-access-id */ 
,/* *gmom’s-processhandle */ 
,/* *jobid */ 
,/* *program-file */ 
,/* maxlen */ 
,/* *program-len */ 
,/* *swap-file */ 
,/* maxlen */ 
,/* *swap-len */ 
,/* *error-detail */ 
,/* *proc-type */ 
,/* *oss-pid */ 
,/* timeout */); 

    printf("error = %d", error); 

    switch(error) { 
    case 0: return 1; /* found */ 
    case 4: return 0; /* not found */   
    } 
    return -1; /* error */ 
} 
+0

我對NonStop並不熟悉,但是不能在某處查找錯誤3意味着什麼? – immibis

回答

0

Reference Manual

試試這個版本:

#include <cextdecs.h(PROCESS_GETINFO_)> 
#include <cextdecs(FILENAME_TO_PROCESSHANDLE_)> 

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

short getProcess(const char *filename); 

int main() 
{ 
    short status; 

    /* Change $XYZ to filename desired */ 
    status = getProcess("$XYZ"); 

    printf("status = %d", status); 

    return 0; 
} 

/* Get process by filename */ 
short getProcess(const char *filename) 
{ 
    short error = FEOK; 
    short length; 
    short processHandle[10] = { 0 }; 

    error = FILENAME_TO_PROCESSHANDLE_(filename, strlen(filename), &processHandle); 
    if (error != FEOK) { 
     printf("error = %d", error); 
     return -1; 
    } 

    /* error: 0 - found; 4 - not found, otherwise - error*/ 
    error = PROCESS_GETINFO_(
     processHandle /* Process handle of process we want - Input */ 
     ,  /* proc-fname */ 
     ,  /* proc-fname-maxlen */ 
     ,  /* proc-fname-len */ 
     ,  /* priority */ 
     ,  /* mom’s-processhandle */ 
     ,  /* hometerm */ 
     ,  /* maxlen */ 
     ,  /* hometerm-len */ 
     ,  /* process-time */ 
     ,  /* creator-access-id */ 
     ,  /* process-access-id */ 
     ,  /* gmom’s-processhandle */ 
     ,  /* jobid */ 
     ,  /* program-file */ 
     ,  /* maxlen */ 
     ,  /* program-len */ 
     ,  /* swap-file */ 
     ,  /* maxlen */ 
     ,  /* swap-len */ 
     ,  /* error-detail */ 
     ,  /* proc-type */ 
     ,  /* oss-pid */ 
     ,  /* timeout */ 
    ); 

    printf("error = %d", error); 

    switch (error) { 
     case 0: 
      return 1; /* found */ 
     case 4: 
      return 0; /* not found */ 
    } 
    return -1; /* error */ 
} 

編輯:使用文件名來處理手柄增加了一個例子。我無法找到任何有關通過名稱獲取流程的信息。

+0

謝謝!你能告訴我爲什麼第三個參數是sizeof(processName)嗎? Tandem sizeof(processName)是4個字節,因爲是指針。在我實現了你的代碼版本後,我得到了相同的錯誤= 3.我已經將第三個參數更改爲ZSYS_VAL_LEN_PROCESSDESCR,並得到錯誤= 0,這意味着找到進程名稱。問題是我定義的進程名稱等於NULL char processName [ZSYS_VAL_LEN_PROCESSDESCR] = {NULL};但仍然有錯誤= 0;我很困惑。沒有正在運行的進程名稱是NULL,爲什麼我得到錯誤= 0(應該找不到)。我錯過了什麼? – uril

+0

我的第一個理解是我將提供const char *進程名稱到 監護程序PROCESS_GETINFO_如果進程正在運行或將來會回覆。在得到你的答覆之後(非常感謝你!)並且仔細閱讀監護人手冊我明白我的錯誤,但仍然有問題。 例如我提供的進程名稱沒有運行,我得到的響應被發現(錯誤= 0)。 char processName [33] =「進程沒有運行」; 錯誤= PROCESS_GETINFO_( ,processName/ ,ZSYS_VAL_LEN_PROCESSDESCR ,與長 – uril

+0

您的右手邊的sizeof是不正確的,我沒有想到,你需要得到處理的進程句柄,你想知道的(如使用狀態'FILENAME_TO_PROCESSHANDLE_')默認情況下,進程句柄是調用進程的句柄(你的程序),我可以用一個例子進行更新,如果你想的話。 – x64architecture