File: ProcessListLinux.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 (98 lines) | stat: -rw-r--r-- 2,153 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
#include "ProcessListLinux.h"
#include <QDir>
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QRegExp>

ProcessListLinux::ProcessListLinux(){

}


int ProcessListLinux::initProccessList(){
    // Получение списка процессов
    sProccess proc;
    QMap<QString,sProccess> result;

    QRegExp rx_digit("^\\d+$");

    QDir dir = QDir("/proc");
    dir.setFilter(QDir::AllDirs);
    QFileInfoList pidList = dir.entryInfoList();
    for (int i=0;i<pidList.size();i++){
        QString pid = pidList.at(i).fileName();
        if (!rx_digit.exactMatch(pid)) continue;


        proc.pid=pid;
        proc.sockets=getSockets(pid);
        proc.program=getProgram(pid);
        proc.cmdline=getCmdline(pid);

        result[pid]=proc;

    }


    proclist=result;

    return 1;
}



sProccess ProcessListLinux::getProc(QString inode){
    QMapIterator<QString, sProccess> i(proclist);
    while (i.hasNext()) {
        i.next();
        for (int p=0;p<i.value().sockets.size();p++){
            if (i.value().sockets.at(p)==inode){
                return i.value();
            }
        }
    }

    return sProccess();
}


QString  ProcessListLinux::getProgram(QString pid){
    QFile file("/proc/"+pid+"/exe");
    return file.symLinkTarget();
}

QString  ProcessListLinux::getCmdline(QString pid){
    QFile file("/proc/"+pid+"/cmdline");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return "";
    QTextStream in(&file);
    QString result = in.readAll();
    file.close();

    for (int i=0;i<result.size();i++){
        if (result[i].unicode()==0){
            result=result.mid(0,i)+" "+result.mid(i+1);
        }

    }

    return result;
}

QStringList ProcessListLinux::getSockets(QString pid){
    QStringList result;

    QRegExp rx("(.*)socket:\\[(.*)\\]");

    QDir dir = QDir("/proc/"+pid+"/fd/");
    dir.setFilter(QDir::AllDirs);
    QFileInfoList fdList = dir.entryInfoList();
    for (int i=0;i<fdList.size();i++){
        QString link = fdList.at(i).symLinkTarget();
        if (rx.exactMatch(link)){
            result.append(rx.cap(2));
        }
    }

    return result;
}