Не получается получить полное имя процесса в поле 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 бинарный берет имя процесса.
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/ если вы хотите увидеть, где он находит свои данные.
Представлен Solaris 11.3 SRU 5 /proc/<pid>/execname
который содержит полное имя команды, так что вы можете проверить, существует ли этот файл и использовать его, если так, иначе вернитесь к ограниченному pr_fname
,
Увидеть Solaris 11.3 SRU 5.6: обновления в ps (1) и / proc /<PID> / {CmdLine, Environ, execname} для деталей.