L002Linux和androidNDK之修改進(jìn)程名

android中不可行的方法prctl

#include <sys/prctl.h>
int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);

這個(gè)方法不知道為什么竟然不行,返回值是0.待查

直接修改argv[0]

測(cè)試代碼:

int main(int argc, char **argv)
{
    strcpy(*argv,"world");
    while(1)
    {
        sleep(1);
    }
}

驗(yàn)證可行钠绍,但是有缺陷秆吵。具體問(wèn)題請(qǐng)看下文。

原理

c程序的main函數(shù)五慈,作為程序啟動(dòng)入口函數(shù)纳寂。main函數(shù)的原型是

int main(int argc , char *argv[]);

其中
argc表示命令行參數(shù)的個(gè)數(shù)主穗;
argv是一個(gè)指針數(shù)組,保存所有命令行字符串毙芜。

Linux進(jìn)程名稱是通過(guò)命令行參數(shù)argv[0]來(lái)表示的忽媒。

Linux 還有環(huán)境變量參數(shù)信息,表示進(jìn)程執(zhí)行需要的所有環(huán)境變量信息腋粥。通過(guò)全局變量 Char **environ;可以訪問(wèn)環(huán)境變量晦雨。

命令行參數(shù)argv和環(huán)境變量信息environ是在一塊連續(xù)的內(nèi)存中表示的,并且environ緊跟在argv后面隘冲。如下圖:

002_1.png

驗(yàn)證argv和environ執(zhí)行連續(xù)內(nèi)存的測(cè)試程序

#include <stdio.h>  
#include <string.h>  

extern char **environ;  
int main(int argc , char *argv[])  
{  
    int i;  

    printf("argc:%d\n" , argc);  

    for (i = 0; i < argc; ++i){  
        printf("%x\n" , argv[i]);  
        printf("argv[%d]:%s\n" , i , argv[i]);  
    }  

    printf("evriron=%x\n" , environ[0]);  

    return 0;  
} 

按理說(shuō)闹瞧,修改進(jìn)程名稱,只需要修改argv[0]指向的內(nèi)存的值為所需要的值即可展辞。但是當(dāng)我們要修改的值超過(guò)argv[0]所指向的內(nèi)存空間大小時(shí)奥邮,再這樣直接修改,就會(huì)覆蓋掉一部分argv[1]的值罗珍,因?yàn)閺纳厦娴膱D中洽腺,很容易就可以看出。

這時(shí)候覆旱,該怎么做呢蘸朋?

  1. 必須重新分配一塊連續(xù)的內(nèi)存空間,把a(bǔ)rgv和environ的參數(shù)都復(fù)制到新的空間扣唱。

  2. 修改argv[0]為所需要修改的值藕坯。

Nginx的做法

 * To change the process title in Linux andSolaris we have to set argv[1]
 * to NULL and to copy the title to the sameplace where the argv[0] points to.
 * However, argv[0] may be too small to hold anew title.  Fortunately, Linux
 * and Solaris store argv[] and environ[] oneafter another.  So we should
 * ensure that is the continuous memory andthen we allocate the new memory
 * for environ[] and copy it.  After this we could use the memory starting
 * from argv[0] for our process title.
 *
 * The Solaris's standard /bin/ps does not showthe changed process title.
 * You have to use "/usr/ucb/ps -w"instead.  Besides, the UCB ps does not
 * show a new title if its length less than theorigin command line length.
 * To avoid it we append to a new title theorigin command line in the
 * parenthesis.
 */
 
extern char **environ;
 
static char *ngx_os_argv_last;
 
ngx_int_t
ngx_init_setproctitle(ngx_log_t *log)
{
    u_char      *p;
    size_t       size;
    ngx_uint_t   i;
 
    size = 0;
 
    for (i = 0; environ[i]; i++) {
        size+= ngx_strlen(environ[i]) + 1;
    }
 
    p = ngx_alloc(size, log);
    if (p == NULL) {
        return NGX_ERROR;
    }
 
   /*
   這是為了找出argv和environ指向連續(xù)內(nèi)存空間結(jié)尾的位置,為了能處理argv[i]被修改后噪沙,指向非進(jìn)程啟動(dòng)時(shí)所分配的連續(xù)內(nèi)存炼彪,而采用了下面的算法。但是實(shí)際上曲聂,這樣還是處理不了這種情況。僅僅是個(gè)人愚見(jiàn)S踊荨E笠浮!
   */
    ngx_os_argv_last= ngx_os_argv[0];
 
    for (i = 0; ngx_os_argv[i]; i++) {
        if (ngx_os_argv_last == ngx_os_argv[i]) {
            ngx_os_argv_last= ngx_os_argv[i]+ ngx_strlen(ngx_os_argv[i]) + 1;
        }
    }
 
    for (i = 0; environ[i]; i++) {
        if (ngx_os_argv_last == environ[i]) {
 
            size= ngx_strlen(environ[i]) + 1;
            ngx_os_argv_last= environ[i]+ size;
 
            ngx_cpystrn(p, (u_char *) environ[i], size);
            environ[i] = (char *) p;
            p+= size;
        }
    }
 
    ngx_os_argv_last--;
 
    return NGX_OK;
}
 
 
void
ngx_setproctitle(char *title)
{
    u_char     *p;
 
#if (NGX_SOLARIS)
 
    ngx_int_t   i;
    size_t      size;
 
#endif
 
    ngx_os_argv[1]= NULL;
 
    p = ngx_cpystrn((u_char*) ngx_os_argv[0], (u_char*) "nginx: ",
                    ngx_os_argv_last- ngx_os_argv[0]);
 
    p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char*) p);
 
#if (NGX_SOLARIS)
 
    size = 0;
 
    for (i = 0; i < ngx_argc; i++) {
        size+= ngx_strlen(ngx_argv[i]) + 1;
    }
 
    if (size > (size_t)((char *) p - ngx_os_argv[0])) {
 
        /*
         * ngx_setproctitle() is too rareoperation so we use
         * the non-optimized copies
         */
 
        p = ngx_cpystrn(p, (u_char *) " (",ngx_os_argv_last - (char*) p);
 
        for (i = 0; i < ngx_argc; i++) {
            p= ngx_cpystrn(p,(u_char *) ngx_argv[i],
                            ngx_os_argv_last - (char*) p);
            p= ngx_cpystrn(p,(u_char *) "", ngx_os_argv_last - (char *) p);
        }
 
        if (*(p - 1) == ' ') {
            *(p- 1) = ')';
        }
    }
 
#endif
 
    if (ngx_os_argv_last - (char*) p) {
        ngx_memset(p, NGX_SETPROCTITLE_PAD,ngx_os_argv_last - (char*) p);
    }
 
    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
                   "setproctitle:\"%s\"", ngx_os_argv[0]);
}

參考鏈接

  1. Linux修改進(jìn)程名稱(setproctitle())
  2. PRCTL(2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膜楷,一起剝皮案震驚了整個(gè)濱河市旭咽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赌厅,老刑警劉巖穷绵,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異特愿,居然都是意外死亡仲墨,警方通過(guò)查閱死者的電腦和手機(jī)勾缭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)目养,“玉大人俩由,你說(shuō)我怎么就攤上這事“┮希” “怎么了幻梯?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)努释。 經(jīng)常有香客問(wèn)我碘梢,道長(zhǎng),這世上最難降的妖魔是什么伐蒂? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任煞躬,我火速辦了婚禮,結(jié)果婚禮上饿自,老公的妹妹穿的比我還像新娘汰翠。我一直安慰自己,他們只是感情好昭雌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布复唤。 她就那樣靜靜地躺著,像睡著了一般烛卧。 火紅的嫁衣襯著肌膚如雪佛纫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天总放,我揣著相機(jī)與錄音呈宇,去河邊找鬼。 笑死局雄,一個(gè)胖子當(dāng)著我的面吹牛甥啄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炬搭,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蜈漓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宫盔?” 一聲冷哼從身側(cè)響起融虽,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灼芭,沒(méi)想到半個(gè)月后有额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年巍佑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茴迁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡句狼,死狀恐怖笋熬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腻菇,我是刑警寧澤胳螟,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站筹吐,受9級(jí)特大地震影響糖耸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丘薛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一嘉竟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洋侨,春花似錦舍扰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至裁僧,卻和暖如春个束,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聊疲。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工茬底, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人获洲。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓阱表,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贡珊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子最爬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容