- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 linux 机器上,我想读取链接的目标字符串。从文档中我找到了以下代码示例(没有错误处理):
struct stat sb;
ssize_t r;
char * linkname;
lstat("<some link>", &sb);
linkname = malloc(sb.st_size + 1);
r = readlink("/proc/self/exe", linkname, sb.st_size + 1);
问题是 sb.st_size 对我系统上的链接返回 0。
那么如何在此类系统上为 readline 动态分配内存?
非常感谢!
供将来引用。使用 jilles 提出的观点:
struct stat sb;
ssize_t r = INT_MAX;
int linkSize = 0;
const int growthRate = 255;
char * linkTarget = NULL;
// get length of the pathname the link points to
if (lstat("/proc/self/exe", &sb) == -1) { // could not lstat: insufficient permissions on directory?
perror("lstat");
return;
}
// read the link target into a string
linkSize = sb.st_size + 1 - growthRate;
while (r >= linkSize) { // i.e. symlink increased in size since lstat() or non-POSIX compliant filesystem
// allocate sufficient memory to hold the link
linkSize += growthRate;
free(linkTarget);
linkTarget = malloc(linkSize);
if (linkTarget == NULL) { // insufficient memory
fprintf(stderr, "setProcessName(): insufficient memory\n");
return;
}
// read the link target into variable linkTarget
r = readlink("/proc/self/exe", linkTarget, linkSize);
if (r < 0) { // readlink failed: link was deleted?
perror("lstat");
return;
}
}
linkTarget[r] = '\0'; // readlink does not null-terminate the string
最佳答案
POSIX 表示符号链接(symbolic link)的 st_size
字段应设置为链接中路径名的长度(没有 '\0'
)。但是,Linux 上的 /proc
文件系统不符合 POSIX。 (它比这一个有更多的违规行为,例如一次读取某些文件时一个字节。)
您可以分配一个特定大小的缓冲区,尝试 readlink()
并在缓冲区不够大时使用更大的缓冲区重试(readlink()
返回为缓冲区中的字节数),直到缓冲区足够大。
或者,您可以使用 PATH_MAX
并破坏系统的可移植性,因为它不是编译时常量或路径名可能比它长(POSIX 允许)。
关于c - 如何将 readlink 与动态内存分配一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385386/
我想提取远程机器的附加 iSCSI 设备 dev_by_path="/dev/disk/by-path/ip-10.1.1.240:3260-iscsi-iqn.2013-12.com.ryussi:
我无法理解 Linux 中“readlink”系统调用的操作。 谁能用简单的例子解释一下? 最佳答案 如果您有一个符号链接(symbolic link),例如 $ ls -l /vmlinuz lrw
在这种情况下,我需要获取一个文件名,以便我可以调用 readlink() 函数。我所拥有的只是一个整数,它最初是通过 open() 命令存储为文件描述符的。问题是,我无权访问执行 open() 命令的
我一直在尝试找出一种方法来获得某种能力,以便能够在 Python 2.7 下返回 Windows 中符号链接(symbolic link)的真实绝对路径。 (我无法升级到 3.x,因为 Maya/3d
在 unistd.h 中,我有 C 函数 readlink,它跟随一个目标的链接。 coreutil readlink 有很棒的 -f 选项可以递归地跟踪每个符号链接(symbolic link)。我
我试图找到运行脚本的真实路径,但是当 $0 在一些包含空格的文件夹中时,readlink 会失败,所以我包围了 $0使用 " ,但这次 readlink 停止工作。 RPATH="$(readli
我正在编写一个 shell 脚本,其中参数将是一个位置的路径。我正在使用 readlink -f 命令来获取用户发送的路径的绝对路径。假设如果用户发送的路径有空格,比如, /home/stac
问题: 在 linux 机器上,我想读取链接的目标字符串。从文档中我找到了以下代码示例(没有错误处理): struct stat sb; ssize_t r; char * linkname; lst
与 GNU coreutils 命令等效的 Perl 命令是什么 readlink -f ? If any component of the file name except the last one
输入 sudo apt autoremove 后出现此错误在终端 readlink: missing operand Try 'readlink --help' for more informatio
我正在尝试使用 readlink -f 获取所有符号链接(symbolic link)后的共享库的绝对路径。 >readlink -f /opt/gcc4.9.3/lib64/libstdc++.so
我想要一个“readlink -f”版本,它提供它执行的每个单独符号链接(symbolic link)解析的跟踪。像这样的东西: $ linktrace /usr/lib64/sendmail /us
我正在尝试分析一些调用 readlink 的代码(不是我自己编写的)积极的bufsize ,然后测试结果是否为零。我看不出结果如何为零,我尝试过的所有内容都是-1,实际链接的大小或软链接(soft l
我正在尝试使用 perl one liner 在 unix 命令行管道中使用正则表达式匹配来打印字符串。 ls -l/APPL 给出输出 lrwxrwxrwx 1 root system 4 Nov
我正在尝试使用 perl one liner 在 unix 命令行管道中使用正则表达式匹配来打印字符串。 ls -l/APPL 给出输出 lrwxrwxrwx 1 root system 4 Nov
前段时间我问了一个关于这个主题的问题,并通过使用 Cygwin 而不是它的 XWin 实用程序“解决”了它,但我又回到了这个问题,因为 Xwin 实用程序不使用我的 GPU 并创建了一个严重的结果是模
我是一个没有经验的 Linux 程序员,正在努力学习使用 readlink()基于此 question and answer . 我调用 readlink()返回 -1 并设置 errno到 2 (
readLink() 存在于 linux 中并在 unistd.h 中定义,请提供 windows 中是否有任何类似类型的函数,否则我们是否可以制作具有类似功能的函数。我想使用相同的功能作为 read
我正在使用 Python Fuse 实现一个文件系统。目录仅包含 symlinks,因此我返回 S_IFLNK | 0777 关于 getattr 方法。 现在,当我在目录上执行 ls 时,我注意到
我在关注 http://www.linuxfromscratch.org/blfs/view/svn/general/pcre.html 安装 pcrc(操作系统:CentOS 6.6)。 我对这条线
我是一名优秀的程序员,十分优秀!