我尝试过popen()
并且它在输出时运行良好,并将"r"
作为第二个参数传递;我知道您可以使用"w"
作为编写模式,它对我也很有效(程序只是一个scanf()
)。我的问题是如何使用append("a"
)模式。你既可以写也可以读,你怎么知道程序什么时候输出什么,什么时候请求用户输入?
最佳答案
popen使用管道(即“popen”中的“p”),管道是单向的。你可以从管道的一端读或写,不能同时从两端读或写。要同时获得读/写访问权限,应该改用socketpair。当我想要像popen这样的东西时,我会在程序中使用它,但是用于读/写:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
FILE *sopen(const char *program)
{
int fds[2];
pid_t pid;
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0)
return NULL;
switch(pid=vfork()) {
case -1: /* Error */
close(fds[0]);
close(fds[1]);
return NULL;
case 0: /* child */
close(fds[0]);
dup2(fds[1], 0);
dup2(fds[1], 1);
close(fds[1]);
execl("/bin/sh", "sh", "-c", program, NULL);
_exit(127);
}
/* parent */
close(fds[1]);
return fdopen(fds[0], "r+");
}
请注意,由于它不返回子的PID,在子程序退出后,将有一个僵尸进程。(除非你设置了SIGCHLD…)