Win32 API에서 Posix popen()에 해당하는 것은?
Win32 API에 Linux/Unix stdio.h popen() 기능과 대략적인 동등성이 있습니까?그렇다면 어디서 찾을 수 있습니까?
편집: D 표준 라이브러리에서 누락된 내용을 패치하려면 이 내용을 알아야 합니다.모든 답변은 표준 Win32 API만 사용해야 하며 MSVC 고유 기능은 사용하지 않습니다.또한, 만약 존재한다면, 저는 끔찍하지 않게 낮은 수준의 것을 원합니다.
MSDN은 Pipe Handle Inheritance에서 Windows API를 사용하여 열기 작업을 수행하는 방법을 설명합니다.여기에는 잘 설명된 예가 있습니다.그것은 그것보다 훨씬 더 낮은 수준입니다._popen
Jason에 의해 링크된 런타임 라이브러리에서 찾을 수 있지만 Win32 API를 독점적으로 사용합니다.
전화하셔도 됩니다._popen
콘솔 애플리케이션을 작성하는 경우.자세한 내용은 MSDN 사이트 http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx 의 설명서를 참조하십시오.
슬프게도 그것은 특별히 쉽지 않습니다.
win32 함수(CreatePipe)를 사용하여 파이프를 생성한 다음 일반적으로 하위 프로세스에 제공하는 파이프의 끝(DuplicateHandle)을 복제하여 상속할 수 있도록 해야 합니다. 그렇지 않으면 상속되지 않으므로 사용할 수 없습니다.
그런 다음 CreateProcess(스타트업 인포를 포함하여 많은 구조 포인터를 사용하는)를 사용하여 프로세스를 생성하고 STDOUT으로 복제한 핸들을 STARTOUT INFO에 전달해야 합니다.
그런 다음 파이프의 판독 끝(Read File 등)에서 e에 도달할 때까지 읽을 수 있으며, 다양한 win32 핸들을 모두 닫아서 정리해야 합니다.
오래된 실을 파내는 중...
위의 Jason Coco의 답변에 대한 반응과 링크된 MSDN 페이지의 주장과는 달리, 요즘은 콘솔이 아닌 앱에서 _popen()이라고 부르는 것이 가능합니다.QuickTime importer 구성 요소에서 호출합니다. 기본적으로 DLL을 위장한 것입니다.콘솔 창이 열리지만 그렇지 않으면 예상되는 동작이 표시됩니다.mingw32의 -mwindow 옵션으로 표준 콘솔 도구를 컴파일하여 GUI 앱으로 만들면 _open은 계속 올바르게 작동합니다(단, 다른 콘솔에서 도구를 실행하는 경우에도 콘솔 창이 열립니다).
이것은 오래된 게시물이지만, 저는 몇 년 전에 윈도우 환경에서 통화와 같은 팝펜()을 사용해야 할 필요도 있었습니다.여기 답변에 있는 몇몇 코멘트들이 언급했듯이, 윈도우 API를 사용하여 고전적인 POSIX에 가까운 것을 구현하는 것입니다.popen()
흥미롭습니다.
저는 코드 리뷰에 제출한 구현을 작성했습니다.이 구현은 다음을 사용합니다.pipes
.stdin
그리고 부터stdout
, 윈도우 메소드 뿐만 아니라CreateProcess(...)
.
링크된 코드는 매우 작은 API로 dll에 내장되도록 설계되었습니다.
int __declspec(dllexport) cmd_rsp(const char *command, char **chunk, unsigned int size);
간단한 사용 예:
#include "cmd_rsp.h"
int main(void)
{
char *buf = {0};
buf = calloc(100, 1);
if(!buf)return 0;
cmd_rsp("dir /s", &buf, 100);
printf("%s", buf);
free(buf);
//or a custom exe
char *buf2 = {0};
buf2 = calloc(100, 1);
cmd_rsp("some_custom_program.exe arg_1 arg_2 arg_n", &buf2, 100);
printf("%s", buf2);
free(buf2);
return 0;
}
예를 들어 다음에서 실행할 수 있는 모든 명령이 필요합니다.stdin
, 명령을 실행할 별도의 프로세스를 만든 다음 모든 응답 내용(있는 경우)을 버퍼로 반환하고 CMD 창 팝업을 표시하지 않고 이 작업을 수행합니다.버퍼는 응답 크기를 수용하기 위해 필요에 따라 커집니다.
언급URL : https://stackoverflow.com/questions/450865/what-is-the-equivalent-to-posix-popen-in-the-win32-api
'itsource' 카테고리의 다른 글
Class current_page_item 추가 중 (0) | 2023.10.29 |
---|---|
ASP에서 NuGet 패키지 위치는 어디입니까?NET Core? (0) | 2023.10.29 |
자바스크립트를 사용하여 브라우저 버전과 운영체제를 탐지하는 방법은? (0) | 2023.10.29 |
최대 높이 설정을 해제하는 방법은? (0) | 2023.10.29 |
HSQL 데이터베이스 사용자에게 권한이 없거나 개체를 찾을 수 없음 오류가 발생했습니다. (0) | 2023.10.29 |