如何在 ac 程序中调用 awk 或 sed?我知道我可以使用 exec(),但我不想处理 fork() 和所有其他的麻烦事。
samoz
问问题
6716 次
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
有函数system
and 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 回答