#windows #iis #iis-8
#Windows #iis #iis-8
Вопрос:
Следующий фрагмент C должен запускаться Windows IIS как CGI .exe-программа. Он выводит три символа «a, b, c» с задержкой в 10 секунд между ними.
Однако, если я использую браузер для доступа к программе, а затем перезагружаю страницу браузера для повторного доступа к программе — тогда я получаю два процесса, запущенных параллельно в IIS. В браузере я, конечно, увижу только вывод процесса 2, поскольку TCP-соединение с процессом 1 было закрыто после получения первого «a».
На сервере Windows процесс 2 успешно завершается, но процессы 1 выполняются только до тех пор, пока не будет выведен второй символ «b». Файл записи, который выводит, что «b» выполнен успешно, а также следующая запись в журнале «Done» также оправдана (таким образом, в файле записи нет фатального исключения). Но затем, внезапно, процесс 1 завершается.
Моя теория заключается в том, что IIS обнаруживает, что некоторый вывод получен из процесса 1, и что IIS затем принудительно завершает его (поскольку клиент отключен)
Если я добавлю режим ожидания на 10 мс (прокомментированный ниже) после файла записи, то процесс 1 даже не выполнит запись в журнал «Готово». Я полагаю, что это связано с тем, что IIS требуется немного времени для выполнения этого завершающего вызова, и без ожидания у процесса есть время выполнить хотя бы запись в журнал «Готово» до завершения работы IIS.
Кто-нибудь узнает это? И как мне помешать IIS завершить процесс (за исключением того, что я начинаю с разветвления его в новый процесс, который не принадлежит IIS), я действительно хотел бы запустить процесс 1 до конца, даже если ни один клиент не «слушает» его…
#include <stdio.h>
#include <windows.h>
void out(char *text)
{
int i;
int written;
char buf[1000];
FILE *fp;
for(i = 0; text[i] != ''; i )
buf[i] = (text[i] == 'n' ? '^' : text[i]);
buf[i] = '';
if((fp = fopen("/temp/testkill.txt", "a")) != NULL) {
fprintf(fp, "%d: Write %sn", _getpid(), buf);
fclose(fp);
}
if(WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), text, strlen(text), amp;written, NULL) == 0)
written = -1;
// Sleep(10);
if((fp = fopen("/temp/testkill.txt", "a")) != NULL) {
fprintf(fp, "%d: Done! %s (%d)n", _getpid(), buf, written);
fclose(fp);
}
}
main()
{
out("Content-Type: text/htmlnn<html><body>n");
out("a");
Sleep(10000);
out("b");
Sleep(10000);
out("c");
}
Комментарии:
1. Я предлагаю вам использовать FastCGI, FastCGI для IIS позволяет размещать популярные платформы приложений, поддерживающие протокол FastCGI, на веб-сервере IIS высокопроизводительным и надежным способом
2. К сожалению, невозможно переключиться с CGI на что-либо еще. Единственное решение, которое я вижу прямо сейчас, — это всегда запускать новый процесс с помощью CreateProcess, ожидая завершения «дочернего» процесса — и, таким образом, процесс ожидания является единственным, который будет уничтожен IIS при отключении клиента.