【问题标题】:Find a sub-string within a buffer inside a Linux kernel function在 Linux 内核函数内的缓冲区中查找子字符串
【发布时间】:2019-10-13 21:28:47
【问题描述】:

我是 Linux 内核开发的新手,我有一个我认为以前没有解决过的问题:

如何在内核函数内部的缓冲区中找到子字符串?

想象一下,我将一个大小合适的文件读入缓冲区(ls -lart 表示文件大小约为 3000)。我想找到并打印该缓冲区中存在子字符串的行。因为我们在内核中,大多数标准的stdio.hstring.h 函数如strstrfgets 不可用。很多当前的堆栈溢出问题,例如:Check substring exists in a string in C 都不那么有效。但是,我确实发现了一个类似的问题:Check for substring in a buffer,但是使用memmem() 是最好的选择吗?虽然我可以作弊,并在我正在查找的缓冲区中手动硬编码,但这不是程序员的方式。

【问题讨论】:

  • 我很确定内核提供了大部分字符串函数,包括strstr
  • 它是“提前谢谢!”,而不是“提前谢谢!”。
  • 当我尝试包含 string.h 时,我收到一条错误消息,提示没有此类文件或目录。显然,除非我在 gcc 编译中明确将其作为 -I 包含在内,否则不会明确添加。这让我觉得这不是应该做的......
  • 这不是正确的标题。等一下,让我grep 内核源代码。

标签: c linux string linux-kernel kernel


【解决方案1】:

strstr 在 Linux 内核中可用。它在linux/string.h 中声明。

但是,如果您已将“文件”读入的缓冲区不是空终止的,则使用 memmem 可能会更安全。

如果要搜索整行,可以在要搜索的字符串的开头和结尾添加\n

或者,如果您不想包含要搜索的整行,您可以在strstr 的结果之前回退(使用char 指针或类似指针)到\n

如果要打印此字符串,请使用linux/printk.h 中的printk。它类似于printf,只是它对%p 格式进行了一些扩展——尽管您可能不必费心打印指针。

【讨论】:

  • 啊!这是有道理的——我认为内核中不提供字符串操作很奇怪。很简单的答案。我可以扩展您的答案 - 您如何最好地打印与缓冲区中的子字符串匹配的行?
  • @BillyThorton kprint,我相信。
  • 对不起,不是执行打印的功能。我在问你如何循环通过缓冲区来匹配该行与子字符串。使用strstr 可以找到存在,但是当你想要匹配的完整行时有点棘手。
  • @BillyThorton 我想说将\n 添加到您要搜索的字符串的开头和结尾。
  • 并且只使用整行作为子字符串,而不仅仅是该行中的子字符串?
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2011-12-18
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多