日期:2014-05-16  浏览次数:21061 次

如何开启一个进程,并接管所有输入输出?
比如我有一个程序a,现在我想在a中使用ftp客户端(一个程序,位置在/usr/bin/ftp),它是交互式的,跟mysql客户端差不多。现在我想接管ftp的所有输入输出,即,我向ftp输入命令,ftp执行,并返回结果,跟直接在终端执行ftp的效果完全一样(有什么用呢?由于命令是从a发出的,a是我写的,我可以自动发出命令,达到自动下载上传文件的目的)!

如果我创建套接字,连接ftp服务器,发送命令:USER PASS STOR等,也可以满足我的要求,但麻烦。用ftp客户端相对简单很多。
------解决方案--------------------
两个pipe即可。
相关函数pipe, dup2
fork,然后将子进程0,1,2用dup2分别重定向到pipe中,然后exec执行ftp程序。
父进程读写两个pipe的另一端即可。
------解决方案--------------------
引用:
开始本来想用pipe,但觉得麻烦,使用了socketpair,这样带来一个严重问题:
socketpair返回的fd似乎当成了块设备

int fd[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
pid_t pid = fork();
if (0 == pid) //child
{
close(fd[0]);
……

你这个理解我也赞同。stdin和stdout是程序的两个全局变量,为FILE*类型,在程序开始时就会用STDOUT_FILENO和STDIN_FILENO,所以setvbuf是不会在exec后的程序中生效的。
目前我也不知道如何解决。不知道有没有什么办法模拟终端,像shell一样。