【发布时间】:2012-04-08 22:34:09
【问题描述】:
为一门课程制作一个简单的 cgi 服务器。为此,在某些时候我必须创建一个 fork/exec 来启动 cgi 处理程序,问题是 exec 不断返回 errno 14。我在独立版本中尝试了以下代码,它可以使用和不使用绝对小路。
代码如下:
static void _process_cgi(int fd, http_context_t* ctx)
{
pid_t childProcess;
int ret;
char returnValue[1024];
log(LOG, "calling cgi", &ctx->uri[1], 0);
if((childProcess = fork()) != 0)
{
///
/// Set the CGI standard output to the socket.
///
dup2(fd, STANDARD_OUTPUT);
//ctx->uri = "/simple.cgi"
execl("/home/dvd/nwebdir/simple.cgi",&ctx->uri[1]);
sprintf(returnValue,"%d",errno);
log(LOG, "exec returned ", returnValue, 0);
return -1;
}
ret = waitpid(childProcess,NULL,0);
sprintf(returnValue,"%d",ret);
log(LOG, "cgi returned", returnValue, 0);
}
这是服务器在到达我的代码之前通过的系统调用列表(按顺序): -chdir - 叉 -setpqrp - 叉 我不知道这是否相关,但在我的测试程序中我没有 chdir 也没有 setpqrp。
测试代码如下:
pid_t pid;
if ((pid = fork()) != 0)
{
execl("simple.cgi","simple");
//execl("/home/dvd/nwebdir/simple.cgi","simple");
return 0;
}
printf("waiting\n");
waitpid(pid, NULL, 0);
printf("Parent exiting\n");
注意我已经在服务器代码中尝试了 execl 和 execlp。
您可以在这里找到基本的服务器实现(没有 CGI),我所做的唯一更改是在 web 功能中: http://www.ibm.com/developerworks/systems/library/es-nweb/index.html
问候
【问题讨论】: