【问题标题】:How can I call awk or sed from inside a c program?如何从 c 程序内部调用 awk 或 sed?
【发布时间】:2010-10-14 02:32:18
【问题描述】:

如何在 c 程序中调用 awk 或 sed?我知道我可以使用 exec(),但我不想处理 fork() 和所有其他讨厌的事情。

【问题讨论】:

    标签: c sed awk exec


    【解决方案1】:

    popen 会起作用吗?它产生进程,然后你用FILE* 句柄读/写

    【讨论】:

      【解决方案2】:

      那么你的选择是system(),或者使用一些为你包装进程生成的库。如果您想对错误、管道等进行精细控制,建议使用后者或您想要避免的核心方式。

      【讨论】:

        【解决方案3】:

        system() 很简单。

        但如果可以的话,你应该尽量不要这样做。当脚本在事物之上而不是在之下时,它们的效果最好。如果您在 UNIX 中,通常最好分解工作并编写一个顶级脚本来调用所有部分。

        我记得看到一个程序员将​​大量系统调用添加到他的 C 代码中,以避免不得不学习 Bourne shell。他认为这是一个聪明而快速的方法,但当它失败时,它就失败了。他浪费了大量的时间来调试这个烂摊子。学习一些简单的 shell 命令会更快...

        保罗。

        【讨论】:

          【解决方案4】:

          libc 具有 systempopen 函数,它们的工作原理如下:

          int system(cont char *command) {
              const char *argv[4] = {"/bin/sh", "-c", command};
              int status;
              pid_t child = fork();
              if (child == 0) {
                  execve(argv[0], argv, NULL);
                  exit(-1);
              }
              waitpid(child, &status, 0);
              return status;
          }
          
          FILE *popen(const char *command, const char *type) {
              int fds[2];
              const char *argv[4] = {"/bin/sh", "-c", command};
              pipe(fds);
              if (fork() == 0) {
                  close(fds[0]);
                  dup2(type[0] == 'r' ? 0 : 1, fds[1]);
                  close(fds[1]);
                  execve(argv[0], argv, NULL);
                  exit(-1);
              }
              close(fds[1]);
              return fdopen(fds[0], type);
          }
          

          (除了更多的错误检查和东西)

          如果您想更好地控制参数处理(而不是通过sh),或者您想控制多个{stdin, stdout, stderr},您必须自己编写或查找库。但标准库涵盖了大多数用例。

          【讨论】:

            【解决方案5】:

            您可以通过 system() 调用来做到这一点这个Thread 就是一个很好的例子

            【讨论】:

              猜你喜欢
              • 2015-06-03
              • 2017-04-23
              • 2023-01-25
              • 1970-01-01
              • 2012-01-24
              • 1970-01-01
              • 2016-03-10
              • 2019-09-12
              • 1970-01-01
              相关资源
              最近更新 更多