Вызов exec возвращает errno 14 (неверный адрес) с абсолютным путем - PullRequest
5 голосов
/ 24 марта 2012

в создании простого сервера 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, которые сервер проходит до достижения моего кода (по порядку): - чдир - вилка - 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), единственные изменения, которые я сделал, были в веб-функции: http://www.ibm.com/developerworks/systems/library/es-nweb/index.html

Привет

Ответы [ 3 ]

15 голосов
/ 24 марта 2012
execl("simple.cgi","simple", NULL);

Нуль необходим, потому что execl () является функцией varargs.

6 голосов
/ 24 марта 2012
    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 голосов
/ 25 марта 2012

Кстати, либо вы скопировали код неправильно, либо он содержит логическую ошибку. Fork () возвращает ненулевой родительский процесс, а не дочерний, поэтому условие должно быть отменено. (Здесь нет кнопки комментария, поэтому отвечайте.)

...