【问题标题】:Buffer Size for execvexecv 的缓冲区大小
【发布时间】:2017-04-13 17:16:28
【问题描述】:

我有一个大学的任务,我需要从管道中读取一个 bash 命令并执行这个命令。我正在考虑使用 execv*,因为我可以通过用空格作为分隔符来创建缓冲区。问题是我不能使用 STL 库,而且我不知道应该如何创建这个缓冲区,因为这个缓冲区的大小是可变的。有什么建议么?提前致谢

【问题讨论】:

  • 选择一个合适的上限,先计算一遍,这样你就知道你需要多少,或者通过分配更大的区域并随时复制数据来实现你自己的可增长向量你需要更多。
  • 是的,我在考虑上限,但我不知道上限应该是多少 xD。对于可增长的向量,我认为为了实现这一点,我需要读取两次文本,一次用于计数,一次用于添加到缓冲区。
  • 您可以选择 128k 或其他足够大的值,这样您就不太可能在分配中碰到它(128k 是 Linux execve 的传统字节大小限制)。如果你先数,你甚至不需要增长它,因为你已经知道它的大小,这很有效。增长只是附加到大小为 N 的缓冲区,如果达到 N,则只需分配一个 2*N 的缓冲区,复制所有元素,然后继续添加。
  • STL 是一个 C++ 库;如果你用 C 编码,当然你不能使用它。你认为你必须处理什么范围? char buffer[4096]; 会工作吗?如果是这样,您可以使用fgets()。如果没有,假设您在类 Unix 的 POSIX 环境中,您可以使用getline()。这将为您获取数据,然后您可以使用sscanf() 或其他技术来解析缓冲区。

标签: c bash pipe buffer exec


【解决方案1】:

如果你只执行一个如下的管道命令,缓冲区大小 30 就足够了,甚至更多

ls -l | wc -l

但是你可以支持多个管道命令,你会得到一个像下面这样的命令,而且你的缓冲区大小必须足够了

cat index.html  | grep ".com" | grep ".splunk." | cut -d "<" -f2  | cut    -d ">" -f1 | grep ":" | cut -d":" -f2  |  cut -d "/" -f3 | cut -d " " -f1 |  grep ".splunk." | cut -d '"' -f1  | sort | uniq 

你的缓冲区大小应该是 100,我为像你这样的操作系统项目选择了大小 100,我们实现了一个终端,它支持几乎所有东西,多管道,重定向,例如...

另外,我使用了如下所示的 execvp,

 execvp(args[0], &args[0]);

【讨论】:

  • 感谢您的回答。有什么特别的理由说 100 就足够管道了吗?
  • 不,没有任何具体原因,我说我的终端支持这个阈值,我认为这个值已经足够了,但是你可以实现任何大小,没有任何限制
  • 好的,再次感谢!
猜你喜欢
  • 2020-09-05
  • 2014-06-10
  • 2015-06-05
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
相关资源
最近更新 更多