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;
}
これは、パイプのオーバーフローによるものと推測します。この問題を解決する方法はありますか?または、大きな出力を処理するための選択肢はありますか?
小さいチャンクに書き込むデータを分割しますか? –
まずは、常に:すべてのシステムコールの戻り値をチェックしてください。 –