调用exec会返回带有绝对路径的错误14(错误地址)

时间:2012-03-24 19:42:30

标签: unix cgi exec fork

为课程制作一个简单的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);
}

以下是服务器在到达我的代码之前传递的sys调用列表(按顺序): - 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

此致

3 个答案:

答案 0 :(得分:15)

execl("simple.cgi","simple", NULL);

需要null,因为execl()是一个varargs - 函数。

答案 1 :(得分:5)

    execl("/home/dvd/nwebdir/simple.cgi", &ctx->uri[1], (char *)0);

execl()的最后一个参数必须为空char *。你通常可以写NULL而不是(char *)0,但如果你有#define NULL 0并且你在sizeof(int) != sizeof(char *)的机器上,它可能无法产生正确的结果,例如作为64位系统。

答案 2 :(得分:2)

BTW,您要么错误地复制了代码,要么它有逻辑错误。 Fork()将非零返回到父进程,而不是子进程,因此应该还原条件。 (这里没有评论按钮,所以回答。)