返回信息流popen不是父进程要等子进程执行完了之后在执行的么?
为什么测试时却不是这样?
测试代码:
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include <string.h>
#include <unistd.h>
int main(){
char str[512];
char ret[512];
sprintf(str, "hive -S -e \"set hive.cli.print.header=false;select count(*) from aa.bb where record_day >= '20151116' and record_day < '20151117';\"");
FILE* p = popen(str,"r");
fgets(ret,512,p);
if (!p)
{
printf("Task");
return false;
}
char tmp[512];
memset(tmp,0,512);
fgets(tmp,512,p);
p.waitpid();
printf("@@@@@@@@@@@[%s][%d]\n",tmp,strlen(tmp));
while(strlen(tmp)<=0)
{
sleep(10);
fgets(tmp,512,p);
printf("@@@@@@@@@@@[%s][%d]\n",tmp,strlen(tmp));
}
printf("-------------hhhhhhhhhhhhhhhh");
printf("--------------QQQQQQQQQQQQQQQQQQQQ");
//pclose(re);
printf("%s\n",ret);
printf("hhhhhhhhhhhhhhhh");
printf("QQQQQQQQQQQQQQQQQQQQ");
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #89457同步于 2015/11/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
popen的使用
yj123
2015/11/18镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
不是这样吗?我是搜集的信息显示是这样的。如果不是这样的话,有没有什么措施达到这种效果
【 在 nuanyangyang 的大作中提到: 】
:
: 本来就不是这样的。
表示确实编译通过了
【 在 littleneko 的大作中提到: 】
: 你这代码都有错,我不知道你是怎么编译通过的
: 然后,你这是写的C还是C++......
【 在 yj123 的大作中提到: 】
: 不是这样吗?我是搜集的信息显示是这样的。如果不是这样的话,有没有什么措施达到这种效果
:
最可靠的还是你的系统上的man page了。
如果你需要阻塞等待的话,我帮你google了一下“popen block waiting”,发现真的有答案。
http://ubuntuforums.org/showthread.php?t=2003371
【 在 yj123 的大作中提到: 】
: 表示确实编译通过了
1、 p.waitpid();这个是什么?我不记得FILE结构体还有这个方法。。。。。
2、我觉得你要问的意思是怎么让父进程读完popen打开的匿名管道中的数据
首先,popen的操作是:创建一个管道,fork一个子进程,关闭未使用的管道,执行一个shell命令,然后等待命令终止。(APUE 中文版 P436)
这里创建的管道是一个匿名管道,并且是阻塞的。关闭的管道根据popen的第二个参数不同,比如“r”则是关闭父进程的写和子进程的读,返回的FILE指向子进程的stdout。
等待命令终止指命令执行完之后子进程就会终止。
所以说你只需要popen然后在返回的FILE上进行读写就行了,并不需要关心子进程是否执行完成并终止
参考下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 10
int main(int argc, char *argv[])
{
char line[MAXLINE];
FILE *fin;
if((fin = popen("ls -l && sleep 4 && ifconfig", "r")) == NULL)
exit(1);
while(fgets(line, MAXLINE, fin) != NULL)
{
printf("%s", line);
}
pclose(fin);
return 0;
}
不好意思,可能是后面测试的时候加进去,后面忘了……
【 在 littleneko 的大作中提到: 】
: 1、 p.waitpid();这个是什么?我不记得FILE结构体还有这个方法。。。。。
: 2、我觉得你要问的意思是怎么让父进程读完popen打开的匿名管道中的数据
: 首先,popen的操作是:创建一个管道,fork一个子进程,关闭未使用的管道,执行一个shell命令,然后等待命令终止。(APUE 中文版 P436)
: ...................