客户端断开连接时,IIS将终止CGI进程

问题描述

下面的C代码段应该由Windows IIS作为CGI .exe程序运行。 它输出三个字符“ a,b,c”,它们之间的延迟为10秒。

但是,如果我使用浏览器访问该程序,然后重新加载浏览器页面以再次访问该程序,那么我将在IIS上并行运行两个进程。 在浏览器上,我当然只会看到进程2的输出,因为在收到第一个“ a”之后,与进程1的TCP连接已关闭。

在Windows服务器上,进程2愉快地运行到完成,但是进程1仅运行直到输出第二个字符“ b”。 输出“ b”成功的WriteFile,以及随后的日志写入“ Done”也被执行(因此,WriteFile中没有致命异常)。 但是随后,进程1突然终止了。

我的理论是IIS检测到从进程1接收到一些输出,然后IIS强制终止它(因为客户端已断开连接)

如果我在WriteFile之后添加了10ms的睡眠(注释如下),则进程1甚至不执行日志写入“完成”。 我想这是由于IIS需要一点时间来执行该Terminate调用,并且如果没有Sleep,则该进程将有时间至少在IIS终止之前执行日志写入“ Done”。

有人知道吗? 以及如何阻止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] != '\0'; i++)
        buf[i] = (text[i] == '\n' ? '^' : text[i]);
    buf[i] = '\0';
    if((fp = fopen("/temp/testkill.txt","a")) != NULL) {
        fprintf(fp,"%d: Write %s\n",_getpid(),buf);
        fclose(fp);
    }

    if(WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),text,strlen(text),&written,NULL) == 0)
        written = -1;
//  Sleep(10);

    if((fp = fopen("/temp/testkill.txt","%d: Done! %s (%d)\n",buf,written);
        fclose(fp);
    }
}
main()
{
    out("Content-Type: text/html\n\n<html><body>\n");
    out("a");
    Sleep(10000);
    out("b");
    Sleep(10000);
    out("c");
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)