File: ProcessExplorer.cpp

package info (click to toggle)
qnetstatview 1.5.8-2
  • links: PTS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 452 kB
  • sloc: cpp: 1,380; makefile: 4
file content (132 lines) | stat: -rw-r--r-- 3,913 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "ProcessExplorer.h"
#include "ui_ProcessExplorer.h"

#include <QFile>
#include <QDir>
#include <QRegExp>

ProcessExplorer::ProcessExplorer(int pid, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ProcessExplorer),
    _pid(pid)
{
    ui->setupUi(this);

    fillFields(_pid);

    ui->tableWidget->horizontalHeader()->setSectionResizeMode(0,QHeaderView::ResizeToContents);
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch);
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(2,QHeaderView::ResizeToContents);
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(3,QHeaderView::ResizeToContents);

    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(close()));
}

ProcessExplorer::~ProcessExplorer(){
    delete ui;
}




void ProcessExplorer::fillFields(int pid){
    ui->label_7->setText("");
    ui->label_5->setText("");
    ui->label_6->setText("");


    // general
    QString procPath = "/proc/"+QString::number(pid);

    // path exe
    QFile filePathExe(procPath+"/exe");
    ui->label_5->setText(filePathExe.symLinkTarget());

    // command line
    QFile fileCmdLine(procPath+"/cmdline");
    if (fileCmdLine.open(QIODevice::ReadOnly)){
        QByteArray fileContents = fileCmdLine.readAll();
        fileContents.replace(char(0x00)," ");
        ui->label_6->setText(fileContents);
        fileCmdLine.close();
    }

    // path exe
    QFile fileCurrentDir(procPath+"/cwd");
    ui->label_7->setText(fileCurrentDir.symLinkTarget());

    QMap<QString, QString> mapFileProcStatus =  mapFromFile("/proc/"+QString::number(pid)+"/status");

    ui->label_8->setText(mapFileProcStatus["Pid"]);
    ui->label_10->setText(mapFileProcStatus["PPid"]);
    ui->label_12->setText(mapFileProcStatus["State"]);

    // Environment
    QFile fileEnviron(procPath+"/environ");
    if (fileEnviron.open(QIODevice::ReadOnly)){
        QByteArray fileContents = fileEnviron.readAll();
        fileContents.replace(char(0x00),"\n");
        ui->textEdit->setText(fileContents);
        fileEnviron.close();
    }

    // Files
    QTableWidgetItem *tmpWidgetItem = nullptr;
    QDir dir(procPath+"/fd");
    dir.setFilter(QDir::Files);
    dir.setSorting(QDir::Name);
    QFileInfoList list = dir.entryInfoList();
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        QString Path = fileInfo.symLinkTarget();

        QMap<QString, QString> mapFile =  mapFromFile("/proc/"+QString::number(pid)+"/fdinfo/"+fileInfo.fileName());
        int pos = mapFile["pos"].toInt();
        QString flags = mapFile["flags"];

        ui->tableWidget->setRowCount(i+1);

        tmpWidgetItem = new QTableWidgetItem(fileInfo.fileName());
        ui->tableWidget->setItem(i, 0, tmpWidgetItem);

        tmpWidgetItem = new QTableWidgetItem(Path);
        tmpWidgetItem->setToolTip(Path);
        ui->tableWidget->setItem(i, 1, tmpWidgetItem);

        tmpWidgetItem = new QTableWidgetItem(QString::number(pos));
        ui->tableWidget->setItem(i, 2, tmpWidgetItem);

        tmpWidgetItem = new QTableWidgetItem(flags);
        ui->tableWidget->setItem(i, 3, tmpWidgetItem);

    }
}


QMap<QString, QString> ProcessExplorer::mapFromFile(QString path){
    QMap<QString, QString> result;

    QFile file(path);
    if (!file.open(QIODevice::ReadOnly|QIODevice::Text)){
        return result;
    }

    QByteArray contents = file.readAll();
    QStringList lines = QString(contents).split(QRegularExpression("[\r|\n]"));
    for (QString line:lines){
        QStringList pairs = line.split(":");
        if (pairs.size()==2){
            QString key=pairs.at(0);
            QString value = pairs.at(1);
            value.replace(QRegularExpression("^\\s+"),"");
            value.replace(QRegularExpression("\\s+$"),"");

            result[key]=value;
        }
    }

    file.close();


    return result;
}