Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > cgi и stdout


Автор: Lych 20.10.2006, 13:44
Возникла такая проблема: пишу cgi скрипт, в нем необходимо вызвать скрипт оболочки.
Результаты своей работы скрипт пишет в stdout и как следствие этот текст попадает в браузер, что крайне не желательно.

Чтобы этого не происходило делаю так:

FILE* stream = freopen( "/wc/freopen.out", "w", stdout);
execl("/wc/webmake.sh", 0)
fclose(stream);

а вот как вернуть stdout в прежнее состояние не знаю.


Автор: MAKCim 20.10.2006, 15:30
Код

int fd = fcntl(STDOUT_FILENO, F_DUPFD, 3);
FILE* stream = freopen( "/wc/freopen.out", "w", stdout);
execl("/wc/webmake.sh", 0)
dup2(fd, STDOUT_FILENO);
close(fd);

Автор: Lych 20.10.2006, 15:51
не работает  smile 

еслине не запускать скрипт то все отлично, а вот если запустить, то потом ничего не выводится

похоже что из execl("/wc/webmake.sh", 0) не возвращается

Автор: MAKCim 20.10.2006, 16:10
Lych
ну да, отвлекся и забыл про execl
execl заменяет образ памяти текущего процесса соответствующей программой
соответственно из execl процесс не возвращается (затирается сегмент кода)
создай новый процесс и в нем сделай execl
Код

...
pid_t pid = fork();

if (pid == 0) {
    int fd = open("/wc/freopen.out", O_WRONLY);
   
     if (fd == -1)
        _exit(errno);
    
    dup2(fd, STDOUT_FILENO);

    /* С этого момента stdout для этого процесса перенаправлен в /wc/freopen.out */

    execl("/wc/webmake.sh", 0);
}

else if (pid < 0); /* Нельзя создать процесс */

/* Тут с stdout все в порядке */

int status;

waitpid(pid, &status, 0);

if (status > 0);   /* Ошибка выполнения скрипта */
/* Далее твоя программа  */
...

Автор: Lych 23.10.2006, 07:33
Огромное СПАСИБО, все заработало. Тему можно закрывать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)