【问题标题】:Using grep in execl with file descriptor在带有文件描述符的 execl 中使用 grep
【发布时间】:2012-08-22 20:28:22
【问题描述】:

我正在尝试执行以下操作:

 execl("/bin/grep","grep","print",fd,NULL);

其中 fd 是文件描述符。 所以基本上这应该在 fd 指向的文件中 grep 为“打印”。 尽管我没有收到编译错误/警告,但它似乎不起作用。 当我给出"Something.txt" 之类的文件名而不是fd 时,它可以工作

谁能告诉我为什么这不起作用? (我知道 execl 只需要 const char arg* 但正如我所说,没有编译错误/警告)。

【问题讨论】:

  • execl 是一个可变参数函数,因此不会对参数进行检查——你可以传递几乎任何东西而不会给出错误或警告。

标签: c grep exec file-descriptor unistd.h


【解决方案1】:

有两个问题:

  • 你在引诱execl 使用一个小整数作为指针
  • 您希望 grep 能够理解文件描述符

如果我正确理解您的问题,就在您exec 之前,您应该将描述符重定向到STDIN_FILENO。比如:

dup2(fd, STDIN_FILENO);
execl("/bin/grep", "grep", "print", NULL);

这应该可以工作,因为grep 在没有提供输入文件时会分析其标准输入。

【讨论】:

  • 我没有得到“你在引诱 execl 使用一个小整数作为指针”部分。是的,我想知道 grep 是否会理解文件描述符。
  • 好吧,你自己说的。 我知道 execl 只需要 const char arg*。所以它别无选择,只能认为你传递的 4 或 5 是一个有效的指针。它不是。
  • execl 采用 char *s,而不是 ints。所以他说你正在传递一个 int ,而 char * 是预期的(通过将 fd 作为第三个参数传递给 execl
  • 根据手册页,grep 似乎也只能从文件中读取。 (快速测试grep pattern < "This is pattern" 似乎也支持这一点) 那么如何将所需的文本重定向到标准输入帮助 grep 读取呢? (对于我在这里可能犯的任何技术错误,我提前道歉,我还在学习)
  • 又是我的错。它确实在标准输入上工作。抱歉,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多