Código
#include <stdio.h> #include <windows.h> int error(char *szErr, int errcode) { return errcode; } DWORD AsynchronouslyListen (HANDLE *phPipeOutRd) { BYTE szBuffer[BUFSIZ]; DWORD dwBytesn; while(ReadFile(*phPipeOutRd, szBuffer, BUFSIZ, &dwBytesn, NULL)) { szBuffer[dwBytesn]='\0'; } return 0; } int main() { HANDLE hPipeOutRd, hPipeOutWr, hPipeInRd, hPipeInWr; SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; DWORD dwBytesn; BYTE szBuffer[BUFSIZ]; HANDLE hAsynchronouslyListenT; sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor=NULL; sa.bInheritHandle=TRUE; if(!CreatePipe(&hPipeInRd, &hPipeInWr, &sa, 0)) { error("CreatePipe()", GetLastError()); } if(!CreatePipe(&hPipeOutRd, &hPipeOutWr, &sa, 0)) { error("CreatePipe()",GetLastError()); } ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESTDHANDLES; si.hStdError=si.hStdOutput=hPipeOutWr; si.hStdInput=hPipeInRd; if(!CreateProcess("C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { error("CreateProcess()", GetLastError()); } sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor=NULL; sa.bInheritHandle=TRUE; if((hAsynchronouslyListenT=CreateThread(&sa, 0, (LPTHREAD_START_ROUTINE)AsynchronouslyListen, &hPipeOutRd, 0, NULL))==NULL) { error("CreateThread()", GetLastError()); } { ZeroMemory(szBuffer, BUFSIZ); if(!WriteFile(hPipeInWr, szBuffer, &dwBytesn, NULL)) { error("WriteFile()", GetLastError()); } } ExitProcess(0); }
El cual produce esta salida:
Citar
Creating pipes for communication... ok
Creating process... ok
Creating thread... ok
Microsoft Windows [Version 10.0.19043.1348]
(c) Microsoft Corporation. All rights reserved.
C:\Users\Programming\Documents\Pipe exercise\1>echo hola
echo hola
hola
C:\Users\Programming\Documents\Pipe exercise\1>
Creating process... ok
Creating thread... ok
Microsoft Windows [Version 10.0.19043.1348]
(c) Microsoft Corporation. All rights reserved.
C:\Users\Programming\Documents\Pipe exercise\1>echo hola
echo hola
hola
C:\Users\Programming\Documents\Pipe exercise\1>
Imprime la cadena del input a la tuberia
He puesto breakpoints (improvisados) aldededor del programa y nada que doy con la parte que imprime esto. Se que no es WriteFile y sospecho que es ReadFile pero no puedo estar seguro porque se esta ejecutando al mismo tiempo que el main thread
¿Alguien sabe a que se debe?
Es el proceso hijo.
CMD.EXE hace eco del comando de entrada... Porque hay dos "gets" aqui... El del proceso hijo mas el del proceso padre... Mira tu que interesante...