它们是相似的功能,但它们之间的确切区别是什么?Linux文档声明:
注意:如果大小是确切的,请使用kmemdup_nul()代替.
发布于 2020-03-14 01:18:28
这两个函数都通过kmalloc()分配所需的内存,然后在分配的缓冲区的末尾放置一个NUL终止符。两者之间唯一的区别是,kstrndup()首先调用strnlen()来计算字符串的长度和所需的大小,从而扫描字符串。
您可以看到kmemdup_nul()是kstrndup()的优化版本。如果您已经知道字符串的长度,则可以避免初始扫描,只需使用传入长度的kmemdup_nul()作为参数。这节省了时间,因为字符串不需要被扫描,这也是你看到那个便条的原因。
此外,如果字符串比max短,那么max可以节省空间,因此如果您不知道字符串的长度,即使kmemdup_nul()也能工作,您可能需要调用kstrndup()来节省空间。
从代码中可以清楚地看到,这两个函数之间唯一的区别是对strnlen()的调用。这是来自mm/util.c的源代码
/**
* kstrndup - allocate space for and copy an existing string
* @s: the string to duplicate
* @max: read at most @max chars from @s
* @gfp: the GFP mask used in the kmalloc() call when allocating memory
*
* Note: Use kmemdup_nul() instead if the size is known exactly.
*
* Return: newly allocated copy of @s or %NULL in case of error
*/
char *kstrndup(const char *s, size_t max, gfp_t gfp)
{
size_t len;
char *buf;
if (!s)
return NULL;
len = strnlen(s, max);
buf = kmalloc_track_caller(len+1, gfp);
if (buf) {
memcpy(buf, s, len);
buf[len] = '\0';
}
return buf;
}
EXPORT_SYMBOL(kstrndup);
/**
* kmemdup_nul - Create a NUL-terminated string from unterminated data
* @s: The data to stringify
* @len: The size of the data
* @gfp: the GFP mask used in the kmalloc() call when allocating memory
*
* Return: newly allocated copy of @s with NUL-termination or %NULL in
* case of error
*/
char *kmemdup_nul(const char *s, size_t len, gfp_t gfp)
{
char *buf;
if (!s)
return NULL;
buf = kmalloc_track_caller(len + 1, gfp);
if (buf) {
memcpy(buf, s, len);
buf[len] = '\0';
}
return buf;
}
EXPORT_SYMBOL(kmemdup_nul);https://stackoverflow.com/questions/60668516
复制相似问题