Comando C++ popen sin consola
console command (3)
Con POSIX debería ser algo como esto:
//Create the pipe.
int lsOutPipe[2];
pipe(lsOutPipe);
//Fork to two processes.
pid_t lsPid=fork();
//Check if I''m the child or parent.
if ( 0 == lsPid )
{//I''m the child.
//Close the read end of the pipe.
close(lsOutPipe[0]);
//Make the pipe be my stdout.
dup2(lsOutPipe[1],STDOUT_FILENO);
//Replace my self with ls (using one of the exec() functions):
exec("ls"....);//This never returns.
} // if
//I''m the parent.
//Close the read side of the pipe.
close(lsOutPipe[1]);
//Read stuff from ls:
char buffer[1024];
int bytesRead;
do
{
bytesRead = read(emacsInPipe[0], buffer, 1024);
// Do something with the read information.
if (bytesRead > 0) printf(buffer, bytesRead);
} while (bytesRead > 0);
Debería verificar los valores de retorno, etc.
cuando uso popen para obtener la salida de un comando, dig dir, se le pedirá una consola.
sin embargo, ¿puedo obtener la salida de un comando sin la apariencia de la consola?
Estoy usando Visual C ++ y quiero hacer una biblioteca para devolver el resultado de algún comando, por ejemplo, dir.
Asumiendo Windows (ya que esta es la única plataforma donde este comportamiento es endémico):
CreatePipe () para crear las canalizaciones necesarias para comunicarse, y CreateProcess para crear el proceso hijo.
HANDLE StdInHandles[2];
HANDLE StdOutHandles[2];
HANDLE StdErrHandles[2];
CreatePipe(&StdInHandles[0], &StdInHandles[1], NULL, 4096);
CreatePipe(&StdOutHandles[0], &StdOutHandles[1], NULL, 4096);
CreatePipe(&StdErrHandles[0], &StdErrHandles[1], NULL, 4096);
STARTUPINFO si; memset(&si, 0, sizeof(si)); /* zero out */
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = StdInHandles[0]; /* read handle */
si.hStdOutput = StdOutHandles[1]; /* write handle */
si.hStdError = StdErrHandles[1]; /* write handle */
/* fix other stuff in si */
PROCESS_INFORMATION pi;
/* fix stuff in pi */
CreateProcess(AppName, commandline, SECURITY_ATTRIBUTES, SECURITY_ATTRIBUTES, FALSE, CREATE_NO_WINDOW |DETACHED_PROCESS, lpEnvironment, lpCurrentDirectory, &si, &pi);
Esto debería hacer más que seguir su camino hacia lo que desea lograr.
Necesitaba resolver esto para mi aplicación de OpenGL para Windows a pantalla completa, pero no pude evitar que apareciera la ventana de la consola. En cambio, retirar el foco después de un breve retraso parece funcionar lo suficientemente bien como para evitar verlo.
_popen(cmd, "wb");
Sleep(100);
ShowWindow(hWnd, SW_SHOWDEFAULT);
SetForegroundWindow(hWnd);
Actualización: aparentemente, esto no funciona si el programa se inicia desde Explorer. Está funcionando cuando se lanzó desde Visual Studio.