如何在c程序中调用awk或sed?我知道我可以使用exec(),但我不想处理fork()和其他所有的肮脏。
答案 0 :(得分:7)
popen
会有效吗?它产生了进程,然后使用FILE*
句柄
答案 1 :(得分:5)
然后您的选择是system()
,或使用一些包装过程产生的库。如果您想要对错误,管道等进行精细控制,建议使用后者或您希望避免的核心方式。
答案 2 :(得分:3)
system()很容易。
但如果可以的话,你应该尽量不这样做。当脚本处于事物之上时,脚本工作效果最好,而不是在下面。如果您使用的是UNIX,那么分解工作并编写顶级脚本以调用所有部分通常会更好。
我记得看过程序员在他的C代码中添加了大量的系统调用,以避免学习Bourne shell。他认为这是一个聪明而快速的方法,但是当它失败时,它失败了。他浪费了大量的时间来调试这些烂摊子。只学习一些简单的shell命令会更快......
保罗。
答案 3 :(得分:1)
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}
,则必须自己编写或查找库。但标准库涵盖了大多数用例。
答案 4 :(得分:1)
你可以通过 system()调用来实现这个Thread就是一个很好的例子