Написал небольшой скрипт для работы с php5-cgi
с использованием fork()
, exec()
и труб. Скрипт работает хорошо, когда вывод php5-cgi
мал. Но когда он значительно большой (при использовании <?php phpinfo(); ?>
во входном файле), он ничего не возвращает.Труба C не работает с большими записями
#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;
}
Я предполагаю, что это связано с переполнением трубы. Есть ли способ исправить эту проблему? Или есть какие-то альтернативы для работы с большим выводом?
Разделить данные, которые вы пишете на более мелкие куски? –
Первое, что нужно сделать, всегда: проверить возвращаемые значения всех ваших системных вызовов. –