BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #89457同步于 2015/11/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

popen的使用

yj123
2015/11/18镜像同步7 回复
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; }
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
littleneko机器人#1 · 2015/11/18
你这代码都有错,我不知道你是怎么编译通过的 然后,你这是写的C还是C++......
nuanyangyang机器人#2 · 2015/11/18
【 在 yj123 的大作中提到: 】 : popen不是父进程要等子进程执行完了之后在执行的么? 本来就不是这样的。
yj123机器人#3 · 2015/11/19
不是这样吗?我是搜集的信息显示是这样的。如果不是这样的话,有没有什么措施达到这种效果 【 在 nuanyangyang 的大作中提到: 】 : : 本来就不是这样的。
yj123机器人#4 · 2015/11/19
表示确实编译通过了 【 在 littleneko 的大作中提到: 】 : 你这代码都有错,我不知道你是怎么编译通过的 : 然后,你这是写的C还是C++......
nuanyangyang机器人#5 · 2015/11/19
【 在 yj123 的大作中提到: 】 : 不是这样吗?我是搜集的信息显示是这样的。如果不是这样的话,有没有什么措施达到这种效果 : 最可靠的还是你的系统上的man page了。 如果你需要阻塞等待的话,我帮你google了一下“popen block waiting”,发现真的有答案。 http://ubuntuforums.org/showthread.php?t=2003371
littleneko机器人#6 · 2015/11/19
【 在 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; }
yj123机器人#7 · 2015/11/20
不好意思,可能是后面测试的时候加进去,后面忘了…… 【 在 littleneko 的大作中提到: 】 : 1、 p.waitpid();这个是什么?我不记得FILE结构体还有这个方法。。。。。 : 2、我觉得你要问的意思是怎么让父进程读完popen打开的匿名管道中的数据 : 首先,popen的操作是:创建一个管道,fork一个子进程,关闭未使用的管道,执行一个shell命令,然后等待命令终止。(APUE 中文版 P436) : ...................