в создании простого сервера 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
Привет