69,373
社区成员
发帖
与我相关
我的任务
分享
if( pipe(gMyInfo.fdIn) != 0 || pipe(gMyInfo.fdOut) != 0){
printf("create pipe Error\n");
return -1;
}
if(( pid = vfork()) < 0){
printf("vfork failed\n");
}
else if ( pid == 0){
close(gMyInfo.fdOut[1]);//write close
if( STDIN_FILENO != gMyInfo.fdOut[0]){
if( dup2(gMyInfo.fdOut[0], STDIN_FILENO) != STDIN_FILENO){
printf("error dup2, stdin\n");
exit(1);
}
close(gMyInfo.fdOut[0]);
}
close(gMyInfo.fdIn[0]);
if( STDOUT_FILENO != gMyInfo.fdIn[1]){
if( dup2(gMyInfo.fdIn[1], STDOUT_FILENO) != STDOUT_FILENO){
printf("errror dup2, stdout\n");
exit(1);
}
close(gMyInfo.fdIn[1]);
}
execl(LFTP, "lftp", NULL, NULL);
}
else{
close(gMyInfo.fdOut[0]);
close(gMyInfo.fdIn[1]);
fifo_init();
while(gMyInfo.exit)
{
//“通过write将lftp命令写入gMyInfo.fdOut[1]“;
//"判断执行上面的命令";
//"本意是想通过read 读取gMyInfo.fdIn[0],读出lftp下载时的输出信息,但read的返回值是零。
//“是不是我上面重定向有问题";
}
close(gMyInfo.fdOut[1]);
close(gMyInfo.fdIn[0]);
fifo_deinit();
}
return 0;
}
还有就是当我把下面这一段注释掉的时候,lftp 的输出信息就会打印到屏幕上。
if( STDOUT_FILENO != gMyInfo.fdIn[1]){
if( dup2(gMyInfo.fdIn[1], STDOUT_FILENO) != STDOUT_FILENO){
printf("errror dup2, stdout\n");
exit(1);
}
close(gMyInfo.fdIn[1]);
}
但这不是我想要的,我想要的是从管道里面读出 lftp 的输出信息
这是原代码
int main_loop()
{
pid_t pid;
gMyInfo.exit=1;
if( pipe(gMyInfo.fdIn) != 0 || pipe(gMyInfo.fdOut) != 0){
printf("create pipe Error\n");
return -1;
}
if(( pid = vfork()) < 0){
printf("vfork failed\n");
}
else if ( pid == 0){
close(gMyInfo.fdOut[1]);//write close
if( STDIN_FILENO != gMyInfo.fdOut[0]){
if( dup2(gMyInfo.fdOut[0], STDIN_FILENO) != STDIN_FILENO){
printf("error dup2, stdin\n");
exit(1);
}
close(gMyInfo.fdOut[0]);
}
close(gMyInfo.fdIn[0]);//read close
if( STDOUT_FILENO != gMyInfo.fdIn[1]){
if( dup2(gMyInfo.fdIn[1], STDOUT_FILENO) != STDOUT_FILENO){
printf("errror dup2, stdout\n");
exit(1);
}
close(gMyInfo.fdIn[1]);
}
execl(LFTP, "lftp", NULL, NULL);
}
else{
close(gMyInfo.fdOut[0]);
close(gMyInfo.fdIn[1]);
fifo_init("axxxa");
while(gMyInfo.exit)
{
/****/
}
close(gMyInfo.fdOut[1]);
close(gMyInfo.fdIn[0]);
fifo_deinit();
}
return 0;
}