【发布时间】:2018-08-07 14:37:57
【问题描述】:
我已经从 shell 测试了这个程序,当从文件重定向标准输入时它可以正常工作。但是,当作为 CGI 程序运行时,它会超时(TimeForCGI hiawatha 网络服务器设置设置为 30 秒)。该程序仅包含在一个文件中。应该注意的是,这个程序只是为了物理验证我一直在阅读的关于 C.G.I. 的内容而编写的,我选择了 C(或任何其他生成二进制可执行文件的东西),所以我可以确定这些东西没有被任何解释器触及,可能会这样做以促进他们的抽象。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <error.h>
int main (void);
int
main
(void)
{
static char buf[BUFSIZ];
size_t size;
if (setvbuf (stdout, NULL, _IOFBF, BUFSIZ) != 0)
error (EXIT_FAILURE, errno, "setvbuf(), stdout");
if (setvbuf (stdin, NULL, _IOFBF, BUFSIZ) != 0)
error (EXIT_FAILURE, errno, "setvbuf(), stdin");
if (setvbuf (stderr, NULL, _IOLBF, BUFSIZ) != 0)
error (EXIT_FAILURE, errno, "setvbuf(), stderr");
printf ("Content-Type: text/plain\n\n");
if (fflush (stdout) == EOF)
error (EXIT_FAILURE, errno, "fflush()");
for (;;)
{
size = fread (buf,1, BUFSIZ, stdin);
if (size == 0)
{
if (feof (stdin) != 0)
goto quit;
else
error (EXIT_FAILURE, errno, "fread(), stdin");
}
size = fwrite (buf, 1, size, stdout);
if (size == 0)
error (EXIT_FAILURE, errno, "write(), stdout");
}
quit:
fflush (stdout);
return EXIT_SUCCESS;
}
这里是对应的html表单;
<html>
<head>
<title>Form</title>
</head>
<body>
<form action="form-process.cgi" method="post">
input_a: <input name="input_a" type="text"><br>
input_b: <input name="input_b" type="text"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
【问题讨论】:
-
您不会检查来自
fread或fwrite的错误。您的环境不同,正如@johnbollinger 的回答所述,服务器不会强制发出 eof 条件信号(关闭进程的输入)您需要检查Content-length。 -
为什么禁用缓冲区然后使用
fread/fwrite调用而不是read/writesystem 调用?你到底想要缓冲吗?