QProcess 에서 말하자면(2)
6403 단어 Qt
QIODevice 파생 클래스
QProcess 는 QIODevice 의 파생 클래스 로 서 실현 측면 에서 볼 때 다음 두 구성원 함 수 를 다시 실현 해 야 합 니 다.
그 다음 에 QIODevice 의 일반적인 용법 에 따라 저 희 는...
상용 코드
부모 클래스 구성원 호출
QProcess::start()
QIODevice::open()
QProcess::readAllStandardError()
QIODevice::readAll()
QProcess::readAllStandardOutput()
QProcess::write()
QIODevice::write()
QProcess::close()
QIODevice::close()
이 외 에 도 QProcess 는 정적 구성원 함수 도 사용 할 수 있 습 니 다.
그러나 이 두 가지 용법 은 QIODevice 가 제공 하 는 기능 과 관계 가 크 지 않 을 것 이다.
시동 을 걸다
나 는 ubuntu 와 windows 시스템 만 있 을 뿐 아래 의 내용 도 이 두 시스템 의 범 위 를 넘 지 않 을 것 이다.dbzhang800 20110116
Unix
시스템 의 api 함수 2 개 와 관련 이 있 습 니 다:
fork()
새 프로 세 스 만 들 기
Liux 에서 api 함수 clone()은 유사 한 기능 을 가지 고 있 습 니 다.주로 스 레 드 구축 에 사용 되 는 것 같 습 니 다.
execve()
새 프로그램 실행 에 사용 하기
조끼(라 이브 러 리 함수)execl()execv()execlp()execvp()execcle()5 개 더 있 습 니 다.
이 execve()는 우리 가 QProcess 를 사용 하 는 데 비교적 중요 해 야 합 니 다.왜냐하면 우리 가 시작 하 는 매개 변 수 는 모두 그것 에 전달 해 야 하기 때 문 입 니 다.
int execve(const char *filename, char *const argv[], char *const envp[]);
filename
"/"가 포함 되 어 있 으 면 경로 이름 으로 간주 합 니 다.그렇지 않 으 면 PATH 환경 변수 가 지정 한 디 렉 터 리 에 따라 검색 합 니 다.filename 은 해석 기 파일 일 수 있 습 니 다.(첫 줄 은\#!/usr/bin/python 이런 거.
argv
명령 행 매개 변수 목록
envp
환경 변수 목록 입 니 다.예 를 들 어 Windows 처럼 현재 경 로 를 PATH 환경 변수 에 추가 하 는 것 도 고려 할 수 있 습 니 다.
그리고 QProcess:startDetached()는 유 닉 스에 서 고아 프로 세 스 를 만 들 었 습 니 다.
Windows
유 닉 스 와 는 달리 Windows 프로 세 스 가 만 든 api 함 수 는 여러 매개 변 수 를 가 진 CreateProcess 입 니 다.
BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
보기 만 해도 머리 가 크 니 작은 예 를 보 자.
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
TCHAR commandLine[] = TEXT("notepad.exe");
CreateProcess(NULL, commandLine, NULL, NULL,
FALSE, 0, NULL, NULL, &si, &pi);
단순 한 시작 과 관련 된 것 만 보기(즉,앞의 fork/execve 인자 와 대응 하 는 것):
윈도 핵심 프로 그래 밍 에 따 르 면 99%의 경우 NULL 을 직접 전달 합 니 다.그것 이 존재 하 는 원래 목적 은 윈도 우즈 의 posix 서브 시스템 을 지원 하기 위 한 것 이다.
이 인자 가 지정 되 어 있 으 면:프로그램 이름 접 두 사 를 지정 해 야 합 니 다.그리고 현재 작업 경로 에 없 으 면 모든 경 로 를 지정 해 야 합 니 다.
주:Qt 가 WindowCE 에서 이 인 자 를 사용 하고 있 습 니 다.
이전 인자 가 NULL 이면 이 문자열 의 첫 번 째 빈 칸(작은 따옴표 로 묶 인 것 은 포함 되 지 않 음)앞의 내용 은 프로그램의 프로그램 이름 입 니 다.
프로그램 이름 에 경 로 를 포함 하지 않 으 면 다음 순서대로 찾 습 니 다.
환경 변수
작업 디 렉 터 리 를 지정 합 니 다.이것 은 앞에서 언급 하지 않 았 습 니 다.유 닉 스에 서 는 fork()/execve()두 단계 로 나 뉘 어 fork()이후 chdir 설정 프로 세 스 의 작업 디 렉 터 리 를 직접 호출 하면 됩 니 다.
마찬가지 로 QProcess::startDetached()의 상황 을 살 펴 보 자.
BOOL bInheritHandles
QProcess::startDetached()
FALSE
부모 프로 세 스 CreateProcess 후 즉시 CloseHandle 을 호출 하여 가지 고 있 는 하위 프로 세 스 의 스 레 드 와 프로 세 스 핸들 을 닫 습 니 다.
QProcess::start()
TRUE
프로 세 스 종료
시작 을 보고 종료(termination)를 간단히 봅 니 다.
C1X 와 C++11 기준 이전에 C/C+기준 에는 스 레 드 와 관련 된 것 이 없습니다. 。따라서 프로 세 스 종료 와 관련 된 함수 가 간단 합 니 다:
앞으로 도 다 중 스 레 드 상황 은 고려 하지 않 겠 습 니 다.이렇게 되면 간단하게 생각 하기 만 하면 된다.
그 중 QProcess::close()호출 QProcess::kill()
unix
유 닉 스에 서 이것 은 kill 을 통 해 신 호 를 보 내 는 것 입 니 다.
int kill(pid_t pid, int sig);
QProcess::kill()
발송::kill(pid,SIGKILL)
QProcess::terminate()
발송::kill(pid,SIGTERM)
프로 세 스 가 끝나 면 부모 프로 세 스에 SIGCHLD 신 호 를 보 냅 니 다.부모 프로 세 스 가 wait 함 수 를 호출 하여 프로 세 스 상 태 를 가 져 옵 니 다.
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
windows
Windows 에서 프로 세 스 가 종 료 된 api 함 수 는?
BOOL TerminateProcess(HANDLE hProcess, UINT fuExitCode);
Qprocess::kill()호출 은 이 함수 입 니 다.그리고 QProcess:terminate()는 다른 것 을 사용 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt로 문자와 이미지의 혼합 텍스트 그리기텍스트를 그리려면 QPainter::drawText 함수를 사용하지만 텍스트와 동시에 이미지 (아이콘 등)를 함께 그리기를 원합니다. QLabel와 QPushButton는 이미지와 텍스트를 표시하는 기능을 가지고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.