xt 发帖数: 17532 | 1 【 以下文字转载自 Programming 讨论区 】
发信人: xt (拷贝猫), 信区: Programming
标 题: Linux GNU C, readlink问题
发信站: BBS 未名空间站 (Fri Dec 18 16:00:34 2009, 美东)
现在我有一个soft link
/home/xt/test/bin/a.out -> /home/xt/build/a.out
然后我执行test/bin/a.out,进入/proc/pid/exe,可以看到
exe -> /home/xt/test/bin/a.out
但是我用GNU C的readlink读出来,发现得到的是
/home/xt/build/a.out
我现在需要的是/home/xt/test/bin/a.out
谁知道这个问题怎么解决? | E*V 发帖数: 17544 | 2 好像是readline的问题,我具体忘了,要么是不是这么用的,
要不就是你参数不对。google一下应该有答案
【在 xt 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: xt (拷贝猫), 信区: Programming : 标 题: Linux GNU C, readlink问题 : 发信站: BBS 未名空间站 (Fri Dec 18 16:00:34 2009, 美东) : 现在我有一个soft link : /home/xt/test/bin/a.out -> /home/xt/build/a.out : 然后我执行test/bin/a.out,进入/proc/pid/exe,可以看到 : exe -> /home/xt/test/bin/a.out : 但是我用GNU C的readlink读出来,发现得到的是 : /home/xt/build/a.out
| xt 发帖数: 17532 | 3 注意,是readlink,不是readline.google没有答案
【在 E*V 的大作中提到】 : 好像是readline的问题,我具体忘了,要么是不是这么用的, : 要不就是你参数不对。google一下应该有答案
| E*V 发帖数: 17544 | 4 google readlink那个manual好像说可以的啊
我有空试试看
【在 xt 的大作中提到】 : 注意,是readlink,不是readline.google没有答案
| E*V 发帖数: 17544 | 5 readlink(2) - Linux man page
Name
readlink - read value of a symbolic link
Synopsis
#include
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
Description
readlink() places the contents of the symbolic link path in the buffer buf,
which has size bufsiz. readlink() does not append a null byte to buf. It wil
l truncate the contents (to a length of bufsiz characters), in case the buff
er is too small to hold all of the contents.
Return Value
The call returns the count of char
【在 xt 的大作中提到】 : 注意,是readlink,不是readline.google没有答案
| E*V 发帖数: 17544 | 6 just tested, correct a
,
wil
buff
【在 E*V 的大作中提到】 : readlink(2) - Linux man page : Name : readlink - read value of a symbolic link : Synopsis : #include : ssize_t readlink(const char *path, char *buf, size_t bufsiz); : Description : readlink() places the contents of the symbolic link path in the buffer buf, : which has size bufsiz. readlink() does not append a null byte to buf. It wil : l truncate the contents (to a length of bufsiz characters), in case the buff
| E*V 发帖数: 17544 | 7 #include
#include
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
int main(){
char path[90];
ssize_t size;
size = readlink("/home/zsdfsf/dfasfsdfadfm", path, 90);
path[size] = '\0';
printf("%d, %s\n", size, path);
return (0);
}
【在 E*V 的大作中提到】 : just tested, correct a : : , : wil : buff
| xt 发帖数: 17532 | 8 用我修改过的code,编译好后,到另一个路径做个softlink,
用softlink执行这个程序。
pid_t pid = getpid();
char buf[40]={0};
sprintf( buf,"/proc/%d/exe", pid);
size=readlink(buf, path, 90);
sleep(120);
你得到的结果会是你的a.out的真实路径
趁这个程序睡觉的时候,你到/proc/pid里面来个ls,
会发现那个exe指向你的soft link.如果你用shell
的readlink得到的也是softlink地址。
这个至少是在我的RHEL5上是这样
【在 E*V 的大作中提到】 : #include : #include : ssize_t readlink(const char *path, char *buf, size_t bufsiz); : int main(){ : char path[90]; : ssize_t size; : size = readlink("/home/zsdfsf/dfasfsdfadfm", path, 90); : path[size] = '\0'; : printf("%d, %s\n", size, path); : return (0);
| N****w 发帖数: 21578 | 9 好像你是想拿到 softlink 的全名?
不是要实质文件的全名?
【在 xt 的大作中提到】 : 用我修改过的code,编译好后,到另一个路径做个softlink, : 用softlink执行这个程序。 : : pid_t pid = getpid(); : char buf[40]={0}; : sprintf( buf,"/proc/%d/exe", pid); : size=readlink(buf, path, 90); : sleep(120); : 你得到的结果会是你的a.out的真实路径 : 趁这个程序睡觉的时候,你到/proc/pid里面来个ls,
| xt 发帖数: 17532 | 10 是。
【在 N****w 的大作中提到】 : 好像你是想拿到 softlink 的全名? : 不是要实质文件的全名?
| N****w 发帖数: 21578 | 11 那不就是文件名么,不用 readlink 阿
【在 xt 的大作中提到】 : 是。
| xt 发帖数: 17532 | 12 不行。文件名是
/proc/pid/exe
整个过程是这样:我用link执行一个文件,然后到/proc下面,
要找到这个link.但是GNU C的readlink返回的是最终的可执行
文件。而shell的readlink返回的是我执行的那个link,也就
是我所要的。
我需要的是exe指向的那个文件名。
【在 N****w 的大作中提到】 : 那不就是文件名么,不用 readlink 阿
|
|