我尝试了popen()
,它适用于以"r"
作为第二个参数传递的输出;我知道你可以使用"w"
作为写作模式,它对我有用(程序只有一个scanf()
)。我的问题是如何使用追加("a"
)模式。您可以同时编写和阅读,如何知道程序何时输出内容以及何时请求用户输入?
答案 0 :(得分:2)
#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 ......)