亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 6943 | 回復(fù): 6
打印 上一主題 下一主題

請(qǐng)教setenv設(shè)置環(huán)境變量的問(wèn)題,setenv之后,對(duì)當(dāng)前程序不起作用? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-05-04 18:05 |只看該作者 |倒序?yàn)g覽
10可用積分
我測(cè)試的代碼如下:
cat test.c
#include<stdio.h>
#include<stdlib.h>
void hi(void)
{
        printf("hi");
}

int main(void)
{
        char *p;
        setenv("LD_PRELOAD","./libmylib.so.1.0",1);
        p=getenv("LD_PRELOAD");
        printf("LD_PRELOAD:%s\n",p);
        //hi();
        printf("hello\n");
}


cat prog.c
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
/*
void _init()
{
    unsetenv("LD_PRELOAD");
    execl("./abc.sh","abc.sh","init",NULL);
}
*/
int printf(const char *s,...)
{
    unsetenv("LD_PRELOAD");
    execl("./abc.sh","abc.sh",s,NULL);
}

gcc test.c -o test
gcc -o prog.o -c prog.c -fPIC
gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0 prog.o -nostartfiles

我的測(cè)試的結(jié)果:
當(dāng)前環(huán)境變量里沒(méi)有LD_PRELOAD,執(zhí)行./test  發(fā)現(xiàn)printf沒(méi)有替換。
然后 我export LD_PRELOAD="./libmylib.so.1.0" 之后,再次執(zhí)行./test,printf就被替換成我的共享庫(kù)里的printf了

為什么test.c里的 setenv("LD_PRELOAD","./libmylib.so.1.0",1); 沒(méi)起作用呢?



還有一個(gè)問(wèn)題,對(duì)于共享庫(kù)中_init  用法,我不是太明白,當(dāng)我把注釋取消的時(shí)候,什么時(shí)候_init 起作用? 好像只要執(zhí)行函數(shù)調(diào)用,這個(gè)_init 就會(huì)起作用,為什么。磕菈K知識(shí)是介紹這塊東西的?謝謝各位給執(zhí)教一下

還有,test.c中,有兩個(gè)printf,export LD_PRELOAD="./libmylib.so.1.0" 之后,只看到t.txt 中有LD_PRELOAD:%s,沒(méi)有看到hello,這個(gè)是為什么?

謝謝指點(diǎn)一下!

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-05-05 13:22 |只看該作者
各位老大,出面給小弟指點(diǎn)一下啊
我在APUE書(shū)上也沒(méi)找到解釋?zhuān)苍S我沒(méi)看懂吧,請(qǐng)各位幫幫忙啊 謝謝啦

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-05-05 15:17 |只看該作者
原帖由 larace 于 2009-5-4 18:05 發(fā)表
我測(cè)試的代碼如下:
cat test.c
#include
#include
void hi(void)
{
        printf("hi");
}

int main(void)
{
        char *p;
        setenv("LD_PRELOAD","./libmylib.so.1.0",1);
       ...


你改變的是當(dāng)前進(jìn)程的環(huán)境變量。貌似本來(lái)你想改變的是他的父進(jìn)程shell的環(huán)境變量,
目標(biāo)錯(cuò)了嘛

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-05-06 19:39 |只看該作者
沒(méi)太明白。
我在shell上export env之后,對(duì)我執(zhí)行的程序有影響,因?yàn)檫@個(gè)環(huán)境變量傳到程序里了
如果我在程序里執(zhí)行setenv 之后,程序內(nèi)的當(dāng)前的環(huán)境變量不是也改了嗎?getenv已經(jīng)看到了,為什么再執(zhí)行某個(gè)函數(shù),這個(gè)環(huán)境變量沒(méi)有起作用呢?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-05-07 18:38 |只看該作者
shell 使用的是內(nèi)置命令,而且修改是當(dāng)前進(jìn)程shell的環(huán)境變量;shell加載程序運(yùn)行時(shí),一般會(huì)復(fù)制shell的環(huán)境變量給那個(gè)進(jìn)程,所以對(duì)那個(gè)進(jìn)程來(lái)說(shuō)會(huì)起作用

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-05-08 07:00 |只看該作者
LZ,你的信益積分怎會(huì)只有5分...

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-05-11 14:31 |只看該作者
LZ,這個(gè)有個(gè)誤解,就是LD_PRELOAD不是給進(jìn)程自己用的,而是loader來(lái)使用的。你在進(jìn)程中修改了自己進(jìn)程的LD_PRELOAD,可是父進(jìn)程(就是shell)并沒(méi)有這個(gè)變量。所以ld.so根本就沒(méi)有什么變化。

通常的做法是寫(xiě)一個(gè)腳本:

wrapper.sh:
export LD_PRELOAD=./libmylib.so.1.0
./test

而不是在進(jìn)程里修改這個(gè)環(huán)境變量
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP