#include "windows.h"
#include "process.h"
#include "stdio.h"
#define BUFFER_MAX 1024
char g_nbstdin_buffer[2][BUFFER_MAX];
HANDLE g_input[2];
HANDLE g_process[2];
DWORD WINAPI console_input(LPVOID lpParameter)
{
for (;;) {
int i;
for (i=0;i<2;i++) {
fgets(g_nbstdin_buffer[i],BUFFER_MAX,stdin);
SetEvent(g_input[i]);
WaitForSingleObject(g_process[i],INFINITE);
}
}
return 0;
}
void create_nbstdin()
{
int i;
DWORD tid;
CreateThread(NULL,1024,&console_input,0,0,&tid);
for (i=0;i<2;i++) {
g_input[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
g_process[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
g_nbstdin_buffer[i][0]='\0';
}
}
const char* nbstdin()
{
DWORD n=WaitForMultipleObjects(2,g_input,FALSE,0);
if (n==WAIT_OBJECT_0 || n==WAIT_OBJECT_0+1) {
n=n-WAIT_OBJECT_0;
SetEvent(g_process[n]);
return g_nbstdin_buffer[n];
}
else {
return 0;
}
}
void main()
{
create_nbstdin();
for (;;) {
const char *line=nbstdin();
if (line) {
printf(">%s",line);
}
else {
Sleep(0);
}
}
}
这个程序会用一个额外的线程去读取 stdin ,我实现了一个叫做 nbstdin() 的函数,其作用有点像 gets() 。但这个函数是非阻塞的,如果控制台没有新的行输入,它会返回一个空指针。
这个程序用了两个输入 buffer 乒乓切换,这样做可以避免在两次调用 nbstdin() 之间对输入 buffer 的处理被读线程破坏掉。
程序结束的时候并没有释放创建出来的 Event 也没有主动关闭读输入的子线程,我觉得这样做更简洁,该 os 处理的事情留给 os 吧 :)