c - 为什么 C readdir 手册页说不要在静态分配的结果结构上调用 free

标签 c unix dirent.h

$ uname -a

Linux crowsnest 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

$ man readdir:

DESCRIPTION

The readdir() function returns a pointer to a dirent structure representing the next directory entry in the directory stream pointed to by dirp...

..[snip]...

The readdir_r() function is a reentrant version of readdir()...

...[snip]...

RETURN VALUE

On success, readdir() returns a pointer to a dirent structure. (This structure may be statically allocated; do not attempt to free(3) it.) If the end of the directory stream is reached, NULL is returned and errno is not changed. If an error occurs, NULL is returned and errno is set appropriately.

The readdir_r() function returns 0 on success. On error, it returns a positive error number. If the end of the directory stream is reached, readdir_r() returns 0, and returns NULL in *result.

我对这意味着什么感到困惑,我对这个函数的应用是收集一个动态分配的指针数组,这些指针指向包含目录条目数据的结构,我想知道我是否可以动态分配 dirent 结构并设置指向它们的指针。但是这一行接缝说结果永远不应该被免费调用,所以我想知道我是否应该分配一个单独的 dirent 结构,它将成为列表的一部分,并将它 memcpy 到返回的结果上。

我也对上面手册页中的“may”这个术语感到困惑。这是否意味着有时它是静态分配的,有时不是。

我很熟悉(模糊地)静态变量在 C 中的含义,但不确定所有规则和围绕它们的可能陷阱。因为我想传递目录中的 dirent 结构,所以我宁愿动态分配它。这是 readdir_r 的用途吗?还是将双指针设置为指向另一个静态分配的 dirent 结构?

而且我不完全确定可重入在这种情况下对于 readdir_r 意味着什么。我对 renetrant 的理解仅来自方案协程,我不确定这将如何应用于读取 unix 目录。

最佳答案

结构可能是静态分配的,可能是线程本地的,也可能是动态分配的。这取决于实现。但无论如何,它不是你能释放的,所以你不能释放它。

readdir_r 不会为你分配任何东西,你给它一个 dirent,随心所欲地分配,它会填充它。因此它确实为你节省了一点与调用 readdir 和复制目录数据相比需要付出一些努力。这不是 readdir_r 的主要目的,不过,它的实际 是能够同时从不同的线程进行调用,这是 readdir.

“可重入”的实际含义是,可以在上一次调用函数返回之前再次调用该函数。通常,这可能意味着来自不同的线程(这是大多数人所说的“线程安全”的意思),来自第一次调用期间发生的信号的处理程序,或由于递归。但C标准中并没有线程的概念,所以提到“可重入”只是后两者的意思。 Posix 定义“线程安全”以要求这种形式的重入,此外,这也是大多数人所说的线程安全。

在Posix中,每一个要求线程安全的函数都要求是可重入的,readdir_r要求是线程安全的。我认为较弱意义上的重入与 readdir_r 无关,因为它不会调用任何可能导致递归的用户代码,而且它不是异步信号安全的,因此不能从信号处理程序。

当心,因为当一些人(Java 程序员)说“线程安全”时,他们的意思是该函数可以被不同的线程同时调用相同的参数,并且将使用锁正常工作。 Posix API 并不意味着线程安全,它们仅意味着可以同时对不同数据调用该函数。函数使用的任何全局数据都受锁或其他方式保护,但参数不需要。

关于c - 为什么 C readdir 手册页说不要在静态分配的结果结构上调用 free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158793/

相关文章:

regex - unix 查找字典序小于给定文件名的文件名

linux - 尝试 grep 位置参数

c - 链表和文件 I/O

c - long long integer 在 C(UNIX+AIX6.1) 中不起作用

c - 在Windows上安装定时器/时钟ISR - 单线程环境中的异步调用

c - 获取目录中文件的大小

c - 使用 stat (st_uid) 的段错误(核心转储)

c - 从十六进制值中提取单个整数值

linux - Linux 终端中是否有用于按键的预输入缓冲区?

c - 在 C 中访问目录