-rw-r--r-- | noncore/settings/sysinfo/processinfo.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/noncore/settings/sysinfo/processinfo.cpp b/noncore/settings/sysinfo/processinfo.cpp index f95d9cc..8e992d5 100644 --- a/noncore/settings/sysinfo/processinfo.cpp +++ b/noncore/settings/sysinfo/processinfo.cpp | |||
@@ -1,57 +1,61 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** ProcessInfo | 2 | ** ProcessInfo |
3 | ** | 3 | ** |
4 | ** Display process information | 4 | ** Display process information |
5 | ** | 5 | ** |
6 | ** Copyright (C) 2002, Dan Williams | 6 | ** Copyright (C) 2002, Dan Williams |
7 | ** williamsdr@acm.org | 7 | ** williamsdr@acm.org |
8 | ** http://draknor.net | 8 | ** http://draknor.net |
9 | ** | 9 | ** |
10 | ** This file may be distributed and/or modified under the terms of the | 10 | ** This file may be distributed and/or modified under the terms of the |
11 | ** GNU General Public License version 2 as published by the Free Software | 11 | ** GNU General Public License version 2 as published by the Free Software |
12 | ** Foundation and appearing in the file LICENSE.GPL included in the | 12 | ** Foundation and appearing in the file LICENSE.GPL included in the |
13 | ** packaging of this file. | 13 | ** packaging of this file. |
14 | ** | 14 | ** |
15 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 15 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
16 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 16 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
17 | ** | 17 | ** |
18 | **********************************************************************/ | 18 | **********************************************************************/ |
19 | 19 | ||
20 | #include <qheader.h> | 20 | #include <qheader.h> |
21 | #include <qlistview.h> | 21 | #include <qlistview.h> |
22 | #include <qlayout.h> | 22 | #include <qlayout.h> |
23 | #include <qtimer.h> | 23 | #include <qtimer.h> |
24 | #include <qfile.h> | 24 | #include <qfile.h> |
25 | #include <qdir.h> | 25 | #include <qdir.h> |
26 | #include <qmessagebox.h> | ||
27 | |||
28 | #include <sys/types.h> | ||
29 | #include <signal.h> | ||
26 | 30 | ||
27 | #include "processinfo.h" | 31 | #include "processinfo.h" |
28 | 32 | ||
29 | ProcessInfo::ProcessInfo( QWidget* parent, const char* name, WFlags fl ) | 33 | ProcessInfo::ProcessInfo( QWidget* parent, const char* name, WFlags fl ) |
30 | : QWidget( parent, name, fl ) | 34 | : QWidget( parent, name, fl ) |
31 | { | 35 | { |
32 | QVBoxLayout *vb = new QVBoxLayout( this, 5 ); | 36 | QVBoxLayout *vb = new QVBoxLayout( this, 5 ); |
33 | 37 | ||
34 | ProcessView = new QListView( this, "ProcessView" ); | 38 | ProcessView = new QListView( this, "ProcessView" ); |
35 | int colnum = ProcessView->addColumn( tr( "PID" ) ); | 39 | int colnum = ProcessView->addColumn( tr( "PID" ) ); |
36 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); | 40 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); |
37 | colnum = ProcessView->addColumn( tr( "Command" ),96 ); | 41 | colnum = ProcessView->addColumn( tr( "Command" ),96 ); |
38 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); | 42 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); |
39 | colnum = ProcessView->addColumn( tr( "Status" ) ); | 43 | colnum = ProcessView->addColumn( tr( "Status" ) ); |
40 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); | 44 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); |
41 | colnum = ProcessView->addColumn( tr( "Time" ) ); | 45 | colnum = ProcessView->addColumn( tr( "Time" ) ); |
42 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); | 46 | ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); |
43 | ProcessView->setAllColumnsShowFocus( TRUE ); | 47 | ProcessView->setAllColumnsShowFocus( TRUE ); |
44 | connect( ProcessView, SIGNAL( doubleClicked(QListViewItem *) ), this, SLOT( viewProcess(QListViewItem *) ) ); | 48 | connect( ProcessView, SIGNAL( doubleClicked(QListViewItem *) ), this, SLOT( viewProcess(QListViewItem *) ) ); |
45 | 49 | ||
46 | vb->addWidget( ProcessView ); | 50 | vb->addWidget( ProcessView ); |
47 | 51 | ||
48 | QTimer *t = new QTimer( this ); | 52 | QTimer *t = new QTimer( this ); |
49 | connect( t, SIGNAL( timeout() ), this, SLOT( updateData() ) ); | 53 | connect( t, SIGNAL( timeout() ), this, SLOT( updateData() ) ); |
50 | t->start( 5000 ); | 54 | t->start( 5000 ); |
51 | 55 | ||
52 | updateData(); | 56 | updateData(); |
53 | } | 57 | } |
54 | 58 | ||
55 | ProcessInfo::~ProcessInfo() | 59 | ProcessInfo::~ProcessInfo() |
56 | { | 60 | { |
57 | } | 61 | } |
@@ -86,34 +90,50 @@ void ProcessInfo::updateData() | |||
86 | if ( processnum >= "0" && processnum <= "99999" ) | 90 | if ( processnum >= "0" && processnum <= "99999" ) |
87 | { | 91 | { |
88 | FILE *procfile = fopen( ( QString ) ( "/proc/" + processnum + "/stat"), "r"); | 92 | FILE *procfile = fopen( ( QString ) ( "/proc/" + processnum + "/stat"), "r"); |
89 | 93 | ||
90 | if ( procfile ) | 94 | if ( procfile ) |
91 | { | 95 | { |
92 | fscanf( procfile, | 96 | fscanf( procfile, |
93 | "%d %s %c %d %d %d %d %d %u %u %u %u %u %d %d %d %d %d %d %u %u %d %u %u %u %u %u %u %u %u %d %d %d %d %u", | 97 | "%d %s %c %d %d %d %d %d %u %u %u %u %u %d %d %d %d %d %d %u %u %d %u %u %u %u %u %u %u %u %d %d %d %d %u", |
94 | &pid, comm, &state, &ppid, &pgrp, &session,&tty, &tpgid, &flags, &minflt, &cminflt, | 98 | &pid, comm, &state, &ppid, &pgrp, &session,&tty, &tpgid, &flags, &minflt, &cminflt, |
95 | &majflt, &cmajflt, &utime, &stime, &cutime, &cstime, &counter, &priority, &timeout, | 99 | &majflt, &cmajflt, &utime, &stime, &cutime, &cstime, &counter, &priority, &timeout, |
96 | &itrealvalue, &starttime, &vsize, &rss, &rlim, &startcode, &endcode, &startstack, | 100 | &itrealvalue, &starttime, &vsize, &rss, &rlim, &startcode, &endcode, &startstack, |
97 | &kstkesp, &kstkeip, &signal, &blocked, &sigignore, &sigcatch, &wchan ); | 101 | &kstkesp, &kstkeip, &signal, &blocked, &sigignore, &sigcatch, &wchan ); |
98 | processnum = processnum.rightJustify( 5, ' ' ); | 102 | processnum = processnum.rightJustify( 5, ' ' ); |
99 | processcmd = QString( comm ).replace( QRegExp( "(" ), "" ); | 103 | processcmd = QString( comm ).replace( QRegExp( "(" ), "" ); |
100 | processcmd = processcmd.replace( QRegExp( ")" ), "" ); | 104 | processcmd = processcmd.replace( QRegExp( ")" ), "" ); |
101 | processstatus = state; | 105 | processstatus = state; |
102 | processtime.setNum( ( utime + stime ) / 100 ); | 106 | processtime.setNum( ( utime + stime ) / 100 ); |
103 | processtime = processtime.rightJustify( 9, ' ' ); | 107 | processtime = processtime.rightJustify( 9, ' ' ); |
104 | fclose( procfile ); | 108 | fclose( procfile ); |
105 | 109 | ||
106 | ( void ) new QListViewItem( ProcessView, processnum, processcmd, processstatus, processtime ); | 110 | ( void ) new QListViewItem( ProcessView, processnum, processcmd, processstatus, processtime ); |
107 | } | 111 | } |
108 | } | 112 | } |
109 | } | 113 | } |
110 | } | 114 | } |
111 | 115 | ||
112 | delete proclist; | 116 | delete proclist; |
113 | delete procdir; | 117 | delete procdir; |
114 | } | 118 | } |
115 | 119 | ||
116 | void ProcessInfo::viewProcess(QListViewItem *process) | 120 | void ProcessInfo::viewProcess(QListViewItem *process) |
117 | { | 121 | { |
122 | QString pid= process->text(0); | ||
123 | QString command = process->text(1); | ||
124 | switch( QMessageBox::information( this, (tr("Kill Process?")), | ||
125 | (tr("You really want to kill\n"+command+" PID: "+pid+"?")), | ||
126 | (tr("Yes")), (tr("No")), 0 )){ | ||
127 | case 0: // Yes clicked, | ||
128 | { | ||
129 | bool ok; | ||
130 | pid_t child=pid.toInt(&ok,10); | ||
131 | if((kill(child,SIGTERM)) < 0) | ||
132 | perror("kill:SIGTERM"); | ||
133 | } | ||
134 | break; | ||
135 | case 1: // Cancel | ||
136 | break; | ||
137 | }; | ||
118 | //printf("Double click for PID: %s\n", process->text(0).stripWhiteSpace().latin1()); | 138 | //printf("Double click for PID: %s\n", process->text(0).stripWhiteSpace().latin1()); |
119 | } | 139 | } |