社区
进程/线程/DLL
帖子详情
控制台程序的问题
cuilonggang
2008-09-06 11:55:59
我想用WriteConsoleInput这类的低级别api来操纵控制台,编写shell服务器,目前实现了一个客户端,如有多个客户端连接,服务进程创建的每个子cmd进程访问标准输入会有冲突,请问如何创建另外的输入缓冲区供子进程使用,并且还能使用WriteConsoleInput这类api?已经知道CreatePipe创建的管道不可以,它只能用WriteFile写入字符内容。
...全文
110
5
打赏
收藏
控制台程序的问题
我想用WriteConsoleInput这类的低级别api来操纵控制台,编写shell服务器,目前实现了一个客户端,如有多个客户端连接,服务进程创建的每个子cmd进程访问标准输入会有冲突,请问如何创建另外的输入缓冲区供子进程使用,并且还能使用WriteConsoleInput这类api?已经知道CreatePipe创建的管道不可以,它只能用WriteFile写入字符内容。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chenyijiu
2008-09-10
打赏
举报
回复
MSDN里面有一些文档可以看看,方法是利用CreateProcess的 LPSTARTUPINFO 参数,
设置dwFlags为STARTF_USESTDHANDLES:
然后自定义:
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
三个流句柄。
这些句柄可以用CreatePipe创建的匿名管道句柄代替:
BOOL CreatePipe(
PHANDLE hReadPipe, // read handle
PHANDLE hWritePipe, // write handle
LPSECURITY_ATTRIBUTES lpPipeAttributes, // security attributes
DWORD nSize // pipe size
);
其中hStdOutput,hStdError传给hWritePipe,hStdInput传给hReadPipe,然后把管道的另一端的句柄保存起来。就可以用ReadFile/WriteFile从这些句柄读取/写入控制台程序的输出/输入。
要注意的是这些句柄的继承性,调用CreateProcess时注意设置BOOL bInheritHandles = TRUE,使它可以继承主进程的句柄。调用CreatePipe要设置LPSECURITY_ATTRIBUTES lpPipeAttributes参数使Pipe的句柄能够被继承。
此外,这样使CreatePipe创建的两个句柄都可以被继承了,所以要调用DuplicateHandle把不需要传入子进程的句柄设置为不可继承。不然子进程拥有了另一个句柄但是不会调用Closehandle减少引用记数,会导致Pipe不能被在使用完毕后被撤消。
此外注意关闭所有使用过的内核对象句柄。
dtor
2008-09-10
打赏
举报
回复
帮顶
cnzdgs
2008-09-06
打赏
举报
回复
把运行情况在描述具体一些。客户端是什么意思?是cmd进程吗?
sys0000
2008-09-06
打赏
举报
回复
可以使用共享内存
cuilonggang
2008-09-06
打赏
举报
回复
服务器创建CMD.EXE子进程,客户端通过网络连接使用,就是终端SHELL,网络通信没有问题,现在就是卡在服务端编程上,服务端只有一个进程,可能创建多个CMD.EXE系统子进程,屏幕输出可以使用CreateConsoleScreenBuffer做到各个CMD.EXE进程互不影响,可是用WriteConsoleInput会有问题,多个CMD.EXE之间会有冲突,不能单独写入指定的CMD.EXE子进程中,具体现象是这次输入被子进程A处理,则下次B会接到输入...。
因为现在多个CMD.EXE子进程是共享父进程标准输入的,所以有这个现象。能不能通过类似CreateConsoleScreenBuffer之类的方式,创建另外的句柄传给cmd.exe子进程(也就是输入重定向但要求能使用WriteConsoleInput,或者不让子进程继承标准输入编程得到其标准输入操作),我试了CreatePipe不行,创建的句柄只能通过WriteFile写入字符流.
编程可以这样学
《编程可以这样学》提出一种全新的学习理念,在我们去窥探各种语言或技术的细枝末节之前,老张会带着大家先去
程序
员的世界里遨游一圈:C语言只是用来写黑底白字的
控制台
程序
吗?算法在游戏开发中有什么用?学校开设...
控制台
程序
无图标
问题
build->run后,仿真器启动后可能自动关闭
控制台
程序
也可能一直显示
控制台
程序
。但在模拟器上看不到
控制台
程序
的图标。1. 因为
控制台
程序
运行结束后退出了。2. 想要
程序
退出后还能看到模拟器,必须先启动模拟器,再从...
控制台
程序
和窗口
程序
此
问题
是由于使用VS编写
程序
时,出现了链接错误(就是因为单任务的
控制台
程序
没有关闭,导致链接失败。新手学习,具体深层的还没有理解) 窗口
程序
多是指windows系统中的运行
程序
是已窗口打开的,如对话框等,可...
控制台
程序
里调用
控制台
程序
现在遇到这么个
问题
,我想用
控制台
里调用
控制台
程序
来实现多文本。 但是在
控制台
里调用
控制台
程序
时,它不是出现新的
控制台
窗口显示,而是已有的
控制台
里显示调用的
程序
, system("D:\\code\\练习\\jjplace\\...
关于Qt
控制台
程序
创建一个Qt的
控制台
程序
,
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章