0
更改Linux'ps'輸出我試圖讓一個程序改變'ps'顯示爲進程的CMD名稱,使用我所見過的技術推薦的簡單覆蓋指向的內存通過argv [0]。這是我寫的示例程序。通過更改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'嗎? – osgx
00000000 66 6f 6f 00 5f 74 65 73 74 00 66 6f 6f 00 62 61 | foo._test.foo.ba | 00000010 72 00 | r。| – Chap
@osgx:好吧,我似乎無法正確格式化,但它對應於下面的tetromino描述。 – Chap