psinfo_t solaris не содержит полного имени процесса в своем поле

Не получается получить полное имя процесса в поле pr_fname структуры psinfo_t при чтении информации о процессе из файла данных psinfo (/ proc /% d / psinfo) в struct psinfo_t из procfs.h в 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 из командной строки, я могу получить полное имя процесса:

ps -p 4970 -o comm

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

0

Решение

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

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

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

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

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

2

Другие решения

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

Увидеть Solaris 11.3 SRU 5.6: обновления в ps (1) и / proc /<PID> / {CmdLine, Environ, execname} для деталей.

2

По вопросам рекламы [email protected]