5

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

4

5 回答 5

7

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

于 2009-03-18T15:07:03.770 回答
5

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

于 2009-03-18T15:07:02.990 回答
3

system() 很简单。

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

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

保罗。

于 2009-03-18T15:22:04.140 回答
1

libc有函数systemand popen,它的工作方式有点像这样:

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},您必须自己编写或查找库。但是标准库涵盖了大多数用例。

于 2009-03-18T15:22:32.110 回答
1

您可以通过system() 调用来完成此线程是一个很好的例子

于 2009-03-18T15:30:45.397 回答