问题描述
下面的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 (将#修改为@)