1

我写了一个像这样的简单程序..

#include<stdio.h>
int main()
{
    int i=0;
    while(1)
        printf("......%d...\n",i++);
    return 0;

}

当这个进程在windows下运行时,它就像一个客户端,而服务器是Csrss.exe。现在我的问题是,当这个客户端尝试打印一些东西时,它会向服务器发送一个请求,并且关于打印的进一步过程由服务器(Csrss.exe)完成。但是客户端会发生什么?客户端进程将继续执行而不用担心值是否实际被打印?或者服务器会阻止客户端,直到它从系统空间得到一些通知?

如果您要使用第二种解决方案,那么还请解释一下,在 MSDN 中写道,在使用 CreateProcess() 之后,我们应该使用 WaitForInputIdle() API 来确保对象实际上是在系统空间中创建的。所以我可以从这个语句中得到的是服务器在发出请求后不会阻塞客户端..

如果您使用第一个解决方案,那么程序的输出是正确的,我的意思是我没有错过任何一个值??

4

1 回答 1

1

基本上,您的进程的标准输出是到 csrss.exe 的管道。printf写入该管道。它至少会阻塞,直到数据存储在某个系统缓冲区中。它是否一直阻塞,直到服务器从管道读取文本并将其呈现在屏幕上,我不确定,我不太明白它为什么重要。

WaitForInputIdle仅对窗口应用程序有意义,对控制台应用程序不重要。它一直等到目标进程GetMessage第一次调用或类似。控制台进程通常不会这样做。从文档中:“如果这个进程是一个控制台应用程序......,WaitForInputIdle立即返回。”

我不明白您对“缺失值”的担忧。

于 2013-09-11T13:02:42.067 回答