如何在c程序中调用awk或sed?

时间:2009-03-18 15:05:40

标签: c sed awk exec

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

5 个答案:

答案 0 :(得分:7)

popen会有效吗?它产生了进程,然后使用FILE*句柄

进行读/写

答案 1 :(得分:5)

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

答案 2 :(得分:3)

system()很容易。

但如果可以的话,你应该尽量不这样做。当脚本处于事物之上时,脚本工作效果最好,而不是在下面。如果您使用的是UNIX,那么分解工作并编写顶级脚本以调用所有部分通常会更好。

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

保罗。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

你可以通过 system()调用来实现这个Thread就是一个很好的例子