2016-03-09 16 views
0

Не получать полное имя процесса в поле psinfo_t struct pr_fname при считывании информации о процессе из файла данных psinfo (/ proc /% d/psinfo) в struct psinfo_t из procfs.h в solaris ,psinfo_t solaris не содержит полного имени процесса в своем поле

Полное определение psinfo_t структура присутствует на сайте ниже:

http://docs.oracle.com/cd/E19253-01/816-5174/6mbb98ui2/index.html

только если имя процесса меньше равно 15 символов, то я получаю полное имя процесса другой мудрой, если имя процесса является более чем 15 символов, тогда я получаю только первые 15 символов символов имени процесса, которые усекаются.

код я использую, как показано ниже:

#include <iostream> 
#include <cstdlib> 
#include <procfs.h> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    // get the pid from command line 
    int pid = atoi(argv[1]); 

    // create the pstatus struct from procfs 
    psinfo_t info; 

    char file[100]; 
    sprintf(file, "/proc/%d/psinfo", pid); 
    ifstream in(file); 
    if (in) 
    { 
     in.read((char*)&info, sizeof(psinfo_t)); 
     in.close(); 

     cout << "My Name: " << info.pr_fname << endl; 
    } 
    else 
    { 
     cout << "Process Not Exists!" << endl; 
    } 

return 0; 
} 

Должен ли я читать какой-то другой файл (кроме PsInfo) из PROCFS файловой системы для того, чтобы получить полное имя процесса. Кроме того, если я использую команду belwo пса из командной строки, то я могу получить полное имя процесса:

ps -p 4970 -o comm 

, но я не хочу, чтобы получить имя процесса, выполнив команду пса внутри моего кода. Мне любопытно, откуда ps бинар подбирает имя процесса.

ответ

2

pr_fname поле psinfo_t структуры составляет 16 байт длиной, в the source code:

#define PRFNSZ  16 /* Maximum size of execed filename */ 

Так это будет на самом деле быть усечен до максимум 15 символов.

Вы можете получить имя фактического двоичного файла с /proc/PID/map. Для 32-битного процесса двоичный файл exec'd будет отображаться по адресу 0x00010000.

Вы можете просматривать исходный код для ps по адресу http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/ps/, если вы хотите увидеть, где он находит свои данные.

+0

есть предопределенная структура, в которой я могу хранить данные этого файла карты. – mSatyam

+0

@mSatyam Это на той же странице man 'proc.4', с которой вы связались в своем вопросе. –

+0

Я пробовал читать файл данных карты в prmap_t struct, но когда я напечатал член данных pr_mapname, это была пустая строка. Вы намеревались сделать что-то еще. Правильно ли я поступаю? – mSatyam

2

Solaris 11.3 SRU 5 представил /proc/<pid>/execname, который содержит полное имя команды, поэтому вы можете проверить, существует ли этот файл и использовать его, если это так, а затем вернуться к ограниченному pr_fname.

Подробнее см. Solaris 11.3 SRU 5.6: updates in ps(1) and /proc/<pid>/{cmdline,environ,execname}.

 Смежные вопросы

  • Нет связанных вопросов^_^