在理解进程的窗口客户端服务器体系结构时遇到麻烦



>我写了一个简单的程序,是这样的。

#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来确保对象实际上是在系统空间中创建的。所以我可以从这个语句中得到的是服务器在发出请求后不会阻止客户端..

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

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

WaitForInputIdle仅对窗口应用程序有意义,对控制台应用程序无关。它会等到目标进程首次调用GetMessage或类似内容。控制台进程通常不会这样做。来自文档:"如果此过程是控制台应用程序...,则WaitForInputIdle立即返回。

我不明白你对"错过的价值"的担忧。

最新更新