2015-07-31 3 views
5

पर सी में वास्तविक प्रक्रिया नाम बदलें मैं वर्तमान में प्रक्रिया की प्रक्रिया नाम बदलने की कोशिश कर रहा हूं, इसलिए मैं htop, top, के साथ अधिक आसानी से पढ़ सकता हूं .... मैं LD_PRELOAD इस कोड को दूसरी प्रक्रिया में बनाना चाहता हूं इसे एक पर्यावरण चर द्वारा बदल दिया जाता है।लिनक्स

मैं इंटरनेट में सामान का एक बहुत पाया है, लेकिन कुछ भी नहीं काम करता है:

prctl(PR_SET_NAME, "Test"); 

इसका कारण यह है htop नाम का सम्मान नहीं कर रहा है काम नहीं करता।

Nginx setproctitle (Link) भी काम नहीं करता है, क्योंकि यह पैरामीटर (जो प्रक्रिया द्वारा आवश्यक हैं) को स्ट्रिप करता है।

मैंने जो कुछ भी पाया वह मैंने कोशिश की और अब मैं विचारों से बाहर हूं।

क्या यह लिनक्स में भी संभव है? और कैसे?

+0

आप निश्चित रूप से हल करने के लिए की जरूरत है यह सी कोड का उपयोग कर? – Useless

+0

यदि यह उत्पादन कर सकता है तो मैं किसी भी अन्य भाषा का उपयोग करूंगा। इसलिए फाइलें जिन्हें प्रीलोड किया जा सकता है। –

+0

तो मूल समस्या यह है कि किसी प्रक्रिया के नाम को कैसे बदला जाए? और पहला समाधान यह प्राप्त करने के लिए एक .so LD_PRELOAD लिख रहा है? अगर मैं आपके व्यवस्थित सेटअप को सही ढंग से समझता हूं, तो एक सरल समाधान हो सकता है जिसके लिए पहले स्थान पर या तो .so या LD_PRELOAD की आवश्यकता नहीं होती है। – Useless

उत्तर

7

बस exec के माध्यम से खोल स्क्रिप्ट या अपने कार्यक्रम के द्वारा अपने कार्यक्रम चलाने के लिए और argv[0] के रूप में वांछित नाम पारित:

#/bin/bash 
exec -a fancy_name a.out ... 

या C/C++:

execl("./a.out", "fancy_name", ...); 
+0

प्रश्न 'C++' के बारे में है और 'bash' या नहीं चल रहा है। –

+0

सच है, लेकिन यह एक एक्स-वाई समस्या की तरह लगता है। चलौ पुंछतैं हैं! – Useless

+0

@VictorPolevoy मेरा मानना ​​है कि ओपी इसे सी द्वारा हल करना चाहता है क्योंकि वह नहीं जानता कि खोल के साथ सरल समाधान है। वैसे भी यह सी/सी ++ कोड द्वारा बहुत समान किया जाता है, मैंने नमूना जोड़ा। – Slava

4
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#define NEW_NAME "hello_world" 
int main(int argc, char **argv) { 
    if(strcmp(argv[0], NEW_NAME)) { 
    argv[0] = NEW_NAME; 
    execv("/proc/self/exe", argv); 
    fputs("exec failed", stderr); 
    return 1; 
    } 
    while(1) // so it goes to the top 
    ; 
}