wsl que for c linux winapi api posix

que - ¿Cuál es el equivalente a Posix popen() en la API de Win32?



windows linux (4)

Desenterrando un hilo viejo ...

Reaccionando a la respuesta anterior de Jason Coco, y al contrario de lo que afirma la página enlazada de MSDN, aparentemente es posible hoy en día llamar a _popen () desde aplicaciones que no son de consola. Lo llamo de un componente importador de QuickTime, básicamente un archivo DLL disfrazado. Abre una ventana de consola pero muestra el comportamiento esperado. Al compilar una herramienta de consola estándar con la opción mingw32 -mwindows para convertirla en una aplicación GUI, _popen continúa funcionando correctamente (pero se abre una ventana de consola incluso cuando se ejecuta la herramienta desde otra consola).

¿Existe un equivalente aproximado de la función Linux / Unix stdio.h popen () en la API de Win32? Si es así, ¿dónde puedo encontrarlo?

Editar: necesito saber esto para corregir una omisión en la biblioteca estándar D. Cualquier respuesta debe usar solo la API Win32 estándar, sin funciones específicas de MSVC. Además, preferiría algo que no sea terriblemente de bajo nivel, si es que existe.


Lamentablemente, no es particularmente fácil.

Necesita crear un conducto usando la función win32 (CreatePipe), luego típicamente necesita duplicar el extremo del conducto (DuplicateHandle) que le está dando al subproceso para permitir que se herede; de ​​lo contrario, no será así. por lo tanto no puede ser usado.

Luego necesita crear un proceso usando CreateProcess (que toma muchos apuntadores de estructura, incluyendo un STARTUPINFO), y pasar en el STARTUPINFO el handle que ha duplicado como su stdout.

Luego puede leer desde el extremo de lectura de la tubería (ReadFile, etc.) hasta que llegue a eof, luego debe limpiar cerrando todas las diferentes manijas win32.



MSDN explica cómo hace lo que hace Popen al usar la API de Windows en la herencia de Handle Pipe . Here proporciona un ejemplo bien documentado. Es mucho más de bajo nivel que la función _popen encontrada en la biblioteca de tiempo de ejecución vinculada por Jason, pero utiliza la API de Win32 exclusivamente.