【发布时间】:2010-10-14 02:32:18
【问题描述】:
如何在 c 程序中调用 awk 或 sed?我知道我可以使用 exec(),但我不想处理 fork() 和所有其他讨厌的事情。
【问题讨论】:
如何在 c 程序中调用 awk 或 sed?我知道我可以使用 exec(),但我不想处理 fork() 和所有其他讨厌的事情。
【问题讨论】:
popen 会起作用吗?它产生进程,然后你用FILE* 句柄读/写
【讨论】:
那么你的选择是system(),或者使用一些为你包装进程生成的库。如果您想对错误、管道等进行精细控制,建议使用后者或您想要避免的核心方式。
【讨论】:
system() 很简单。
但如果可以的话,你应该尽量不要这样做。当脚本在事物之上而不是在之下时,它们的效果最好。如果您在 UNIX 中,通常最好分解工作并编写一个顶级脚本来调用所有部分。
我记得看到一个程序员将大量系统调用添加到他的 C 代码中,以避免不得不学习 Bourne shell。他认为这是一个聪明而快速的方法,但当它失败时,它就失败了。他浪费了大量的时间来调试这个烂摊子。学习一些简单的 shell 命令会更快...
保罗。
【讨论】:
libc 具有 system 和 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},您必须自己编写或查找库。但标准库涵盖了大多数用例。
【讨论】:
您可以通过 system() 调用来做到这一点这个Thread 就是一个很好的例子
【讨论】: