Я пытаюсь заставить программу изменить то, что 'ps' отображает в качестве имени CMD процесса, используя технику, которую я видел, рекомендованную для простого наложения памяти, на которую указывает argv [0]. Вот пример программы, которую я написал.
#include <iostream>
#include <cstring>
#include <sys/prctl.h>
#include <linux/prctl.h>
using std::cout;
using std::endl;
using std::memcpy;
int main(int argc, char** argv) {
if ( argc < 2 ) {
cout << "You forgot to give new name." << endl;
return 1;
}
// Set new 'ps' command name - NOTE that it can't be longer than
// what was originally in argv[0]!
const char *ps_name = argv[1];
size_t arg0_strlen = strlen(argv[0]);
size_t ps_strlen = strlen(ps_name);
cout << "Original argv[0] is '" << argv[0] << "'" << endl;
// truncate if needed
size_t copy_len = (ps_strlen < arg0_strlen) ? ps_strlen+1 : arg0_strlen;
memcpy((void *)argv[0], ps_name, copy_len);
cout << "New name for ps is '" << argv[0] << "'" << endl;
cout << "Now spin. Go run ps -ef and see what command is." << endl;
while (1) {};
}
Результат:
$ ./ps_test2 foo
Original argv[0] is './ps_test2'
New name for ps is 'foo'
Now spin. Go run ps -ef and see what command is.
Результат ps -ef:
5079 28952 9142 95 15:55 pts/20 00:00:08 foo _test2 foo
Ясно, что "foo" был вставлен, но его нулевой ограничитель либо игнорировался, либо превращался в пробел. Завершающая часть исходного argv [0] все еще видна.
Как я могу заменить строку, выводимую ps?
/proc/$pid/cmdline
файла? Вы можете сделать этоhexdump -C
? - person osgx   schedule 01.05.2014