【发布时间】:2021-12-13 19:08:01
【问题描述】:
我用 CreateProcess() 创建了一个子进程。 cmd.exe 的一个实例。第一个命令在创建进程时传递,第二个命令在创建进程后通过 WriteFile() 传递。第一项工作完成了,第二项没有完成,我不知道原因。请帮忙
创建进程的代码为:
PROCESS_INFORMATION _info;
char cmd[1024];
strcpy(cmd,"C:\\Windows\\system32\\cmd.exe /k echo 1");
HANDLE _stdin_rd = NULL;
HANDLE _stdin_wr = NULL;
HANDLE _stdout_rd = NULL;
HANDLE _stdout_wr = NULL;
BOOL br;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
br = CreatePipe(&_stdin_rd, &_stdin_wr, &sa, 0);
br = SetHandleInformation(_stdin_wr, HANDLE_FLAG_INHERIT, 0);
br = CreatePipe(&_stdout_rd, &_stdout_wr, &sa, 0);
br = SetHandleInformation(_stdout_rd, HANDLE_FLAG_INHERIT, 0);
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&_info, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = _stdin_rd;
si.hStdOutput = _stdout_wr;
si.hStdError = _stdout_wr;
br = CreateProcess(0, cmd,0,0,TRUE,CREATE_NO_WINDOW,0,0,&si,&_info);
CloseHandle(_stdout_wr);
CloseHandle(_stdin_rd);
CloseHandle(_info.hProcess);
CloseHandle(_info.hThread);
printf("process created...\n");
Sleep(320);
printf("waited\n\n");
与进程通信的代码是:
char bufy[10240];
char kom[1024];
long unsigned int prt, ovs=0;
for(int i=2;i<10;++i){
if(!ReadFile(_stdout_rd,bufy+ovs,10240-ovs,&prt,0)){
printf(" ERROR=%d\n",GetLastError());
break;
}
ovs+=prt;
printf("respond: ");
bufy[ovs]=0;
printf("%s\n",bufy);
sprintf(kom,"/k echo %d",i);
BOOL odgw = WriteFile(_stdin_wr,kom,strlen(kom),0,0);
printf("sent(%s): %s\n",odgw?"TRUE":"FALSE",kom);
}
return 0;
我得到的程序输出是:
process created...
waited
respond: 1
D:\>
sent(TRUE): /k echo 2
【问题讨论】:
-
你不做任何错误检查。开始为此添加代码。
-
如果你的代码被编译,那么这不是C++。
-
@Jabberwocky 我在上传之前删除了错误检查,因为我想让你们阅读得更清楚。无论如何,从我的输出中您可以推断出代码卡在 ReadFile() 处。您还需要在哪里进行错误检查?
-
@S.M.哪一部分不是 C++?
-
char *cmd = "C:...