【问题标题】:How to grep in C? [closed]如何在C中grep? [关闭]
【发布时间】:2018-04-17 01:03:50
【问题描述】:

取消 execlp 到 grep
这段代码有什么问题

int main(){
      int fd[2];
      pid_t child_pid;

      pipe(fd);

      if((child_pid = fork())<0){
          perror("fork error");
          exit(0);
      }
      if(child_pid >0){
          close(fd[0]);
          execlp("/bin/ps", "/bin/ps", "-ef", NULL);
      }
      else{
          close(fd[1]);
          execlp("/bin/grep", "/bin/grep", "root", NULL);
      }
      return 0;
 }

有问题:/bin/grep:(标准输入):输入/输出错误

【问题讨论】:

  • 是做一些功课(用C 编写ps -ef | grep telnet等效)还是你真的在C 程序中寻找哪些进程正在使用telnet? SO 不是 do-my-homework 服务。
  • 您的问题缺少一些 Linux 或 POSIX 标记。
  • SO 不是 fix-my-bugdo-my-homework 服务。
  • 不,您的问题是对 Linux 进程如何工作的误解(与greppstelnet 没有真正的关系)。我的回答提供了一些线索,但我不会做你的功课。花几个小时阅读 ALP。
  • 但是你可以用echo 替换ps,用wc替换grep,用telnet替换-l,你的程序仍然是错误的。所以你不是专门询问grep。 ALP 有几个章节与您的问题相关,您需要阅读它们。

标签: c grep pipe


【解决方案1】:

您可以使用(在 Linux 或 POSIX 上)popen(3) 函数。不要忘记pclose(不是fclose)这样的流。

在您找到在 Linux 上运行 telnet 的进程的特殊情况下,您甚至不需要为此创建另一个进程(如果您愿意,请使用 pgrep(1))。你可以直接使用/proc/(见proc(5))。例如,您可以使用opendir(3)readdir(3) 和相关函数扫描/proc/ 以查找以数字开头的目录(因此对应于进程)。比每个这样的目录,例如/proc/1234/ 您可以阅读 /proc/1234/cmdlinereadlink(2)/proc/1234/exe。您将使用snprintf(3) 来构造与这些文件路径相对应的字符串。

您的程序显示出对fork(2)pipe(2)execve(2) 的一些混淆。您可能想要使用dup2(2),并且可能需要多次调用fork 并使用waitpid(2)

阅读ALP(可免费下载)或其他有关 Linux 编程的书籍。

考虑使用strace(1)(可能使用-f)来了解发生了什么。不要忘记编译所有警告和调试信息gcc -Wall -Wextra -g 并使用gdb 调试器(小心,它可用于多进程程序)。

关于您的新编辑(“如何在 C 中 grep”),grep(1) 使用 regular expressions,您可以在 POSIX 上使用 regex(3) 在您的 C 代码中使用它们。你不需要 fork 一个新的进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多