проверьте, запущен ли процесс в HP NonStop OSS Tandem

У меня есть имя процесса, и я хотел бы проверить, запущен ли процесс в HP NonStop OSS. Я создал небольшую демонстрацию C, но получил ошибку от процедуры Guardian PROCESS_GETINFO_. Номер ошибки 3. Ниже мой код. Не могли бы вы сказать мне, в чем проблема?

#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 */
}

person uril    schedule 12.01.2016    source источник
comment
Я не знаком с NonStop, но не могли бы вы где-нибудь поискать, что означает ошибка 3?   -  person user253751    schedule 13.01.2016


Ответы (1)


Справочное руководство

Попробуйте эту версию:

#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 */
}

Изменить: добавлен пример использования имени файла для обработки дескриптора. Я не смог найти никакой информации о том, как получить процесс по имени.

person x64architecture    schedule 13.01.2016
comment
Благодарю вас! Не могли бы вы объяснить мне, почему третьим параметром является sizeof(processName)? В тандеме sizeof(processName) равен 4 байтам, потому что это указатель. После того, как я реализовал вашу версию кода, я получил ту же ошибку = 3. Я изменил третий параметр на ZSYS_VAL_LEN_PROCESSDESCR и получил ошибку = 0, что означает, что найдено имя процесса. Проблема в том, что я определил имя процесса равным NULL char имя_процесса[ZSYS_VAL_LEN_PROCESSDESCR] = {NULL}; но все равно получил ошибку = 0; Я сбит с толку. Нет имени запущенного процесса, которое равно NULL, и почему я получил ошибку = 0 (оно не должно быть найдено). Я что-то пропустил? - person uril; 14.01.2016
comment
Мое первое понимание заключалось в том, что я предоставлю имя процесса const char* процедуре Guardian PROCESS_GETINFO_, которая ответит, запущен процесс или нет. Получив от вас ответ (Большое спасибо!) и более внимательно прочитав руководство Guardian, я понял свою ошибку. Но у меня все еще есть проблема. Например, я указываю имя процесса, который не запущен, и получаю ответ, который найден (ошибка = 0). char имя_процесса[33] = процесс не запущен; ошибка = PROCESS_GETINFO_ (, имя_процесса /, ZSYS_VAL_LEN_PROCESSDESCR, & длина - person uril; 15.01.2016
comment
Ваше право sizeof было неправильным, я не думал. Вам нужно получить дескриптор процесса, статус которого вы хотите узнать (например, использовать FILENAME_TO_PROCESSHANDLE_), по умолчанию дескриптор процесса - это дескриптор вызывающего процесса (вашей программы). Я могу обновить пример, если хотите. - person x64architecture; 15.01.2016
comment
Не могли бы вы привести пример? - person uril; 15.01.2016
comment
БОЛЬШОЕ СПАСИБО! РАБОТАЕТ! - person uril; 15.01.2016