毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

如何开启一个进程,并接管所有输入输出

更新时间:2012-12-25:  来源:毕业论文

如何开启一个进程,并接管所有输入输出
比如我有一个程序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]);
dup2(fd[1], STDOUT_FILENO);
dup2(fd[1], STDIN_FILENO);
close(fd[1]);
setvbuf(stdin, NULL, _IOLBF, 0);
setvbuf(stdout, NULL, _IOLBF, 0);

puts("hello, i'm ftp client.");
//execl("/usr/bin/ftp", "ftp", "localhost", NULL);
...

如上,子进程开启了ftp程序,父进程无法取到ftp的输出(直到ftp退出,才把所有输出一并发了过来),但puts("hello, i'm ftp client.");这行可以收到,我想了很久,猜想如下:
STDOUT_FILENO和STDIN_FILENO是父子进程共享的,但stdout和stdin不是,在子进程里面:
setvbuf(stdin, NULL, _IOLBF, 0);
setvbuf(stdout, NULL, _IOLBF, 0);
这两句是想作用的(没有的话连puts("hello, i'm ftp client.");都不会发送),但在子进程里面execl的时候,到了ftp的内部,它又重新从STDOUT_FILENO和STDIN_FILENO创建了stdout和stdin,由于STDOUT_FILENO和STDIN_FILENO是块设备,所以当ftp用puts spintf等语句输出的时候,消息一起在stdout的buufer里面,没有fflush。
平时在控制台输出的时候,没有使用setvbuf也行是因为控制台是字符型设备,在遇到换行时就自动fflush。

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

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。