【发布时间】:2016-04-12 06:33:34
【问题描述】:
使用fork()、exec() 和管道编写了一个小脚本来处理php5-cgi。当php5-cgi 的输出很小时,下面的脚本运行良好。但是当它相当大时(在输入文件中使用<?php phpinfo(); ?> 时),它不会返回任何内容。
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
int main(int argc, char const *argv[]) {
int status;
int link[2];
char out[4096];
char * arg[3]={"php5-cgi","a.php",0};
if (pipe(link)==-1){
perror("pipe");
}
int pid=fork();
if (!pid){
dup2 (link[1], 1);
close(link[0]);
execvp("php5-cgi", arg);
} else {
waitpid(pid, &status,0);
close(link[1]); // parent doesn't write
char reading_buf[1];
while(read(link[0], reading_buf, 1) > 0){
write(1, reading_buf, 1);
}
close(link[0]);
}
printf("%s\n", "end");
return 0;
}
我认为这是由于管道溢出造成的。我有什么办法可以解决这个问题吗?或者有没有其他方法可以处理大输出?
【问题讨论】:
-
将你写入的数据拆分成更小的块?
-
始终要做的第一件事:检查所有系统调用的返回值。