Imprime texto de la nada. Tuberias (Solucionado)

Iniciado por Usuario887, 13 Noviembre 2021, 18:08 PM

0 Miembros y 1 Visitante están viendo este tema.

Usuario887

Tengo este codigo:

#include <stdio.h>
#include <windows.h>

int error(char *szErr, int errcode)
{
   printf("\r\nError: RTL: %s: %d", szErr, errcode);
   return errcode;
}

DWORD AsynchronouslyListen (HANDLE *phPipeOutRd)
{
   BYTE szBuffer[BUFSIZ];
   DWORD dwBytesn;

   while(ReadFile(*phPipeOutRd,
                  szBuffer,
                  BUFSIZ,
                  &dwBytesn,
                  NULL))
   {
       szBuffer[dwBytesn]='\0';
       printf("%s", szBuffer);
   }

   return 0;
}

int main()
{
   HANDLE hPipeOutRd, hPipeOutWr,
          hPipeInRd, hPipeInWr;

   SECURITY_ATTRIBUTES sa;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;

   DWORD dwBytesn;
   BYTE szBuffer[BUFSIZ];

   HANDLE hAsynchronouslyListenT;

   printf("\r\nCreating pipes for communication... ");

   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());
   }

   printf("ok ");

   printf("\r\nCreating process... ");

   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());
   }

   printf("ok ");

   printf("\r\nCreating thread... ");

   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());
   }

   printf("ok ");

   printf("\r\n");

   while(strcmp(szBuffer, "exit")&&\
         strcmp(szBuffer, "end"))
   {
       printf("\r\n");

       ZeroMemory(szBuffer, BUFSIZ);
       gets(szBuffer);
       szBuffer[strlen(szBuffer)]='\n';
       szBuffer[strlen(szBuffer)+1]=0;

       if(!WriteFile(hPipeInWr,
                     szBuffer,
                     strlen(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>

Imprime la cadena del input a la tuberia  :huh: :huh: :huh: :huh: :huh: :huh:

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...