QProcess 에서 말하자면(2)

6403 단어 Qt
앞에서 QProcess 에서 말 한(1)이름 을 이 어 가 며 각 도 를 바 꿔 계속 공부 합 니 다.
QIODevice 파생 클래스
QProcess 는 QIODevice 의 파생 클래스 로 서 실현 측면 에서 볼 때 다음 두 구성원 함 수 를 다시 실현 해 야 합 니 다.
  • readData()
  • writeData()

  • 그 다음 에 QIODevice 의 일반적인 용법 에 따라 저 희 는...
  • QIODevice 호출::open()장치 열기
  • QIODevice 사용::read()/QIODevice::write()읽 기와 쓰기
  • QIODevice 사용::close()닫 기
  • 실제로 우리 의 일반적인 용법 은:
    상용 코드
    부모 클래스 구성원 호출
    QProcess::start()
    QIODevice::open()
    QProcess::readAllStandardError()
    QIODevice::readAll()
    QProcess::readAllStandardOutput()
    QProcess::write()
    QIODevice::write()
    QProcess::close()
    QIODevice::close()
    이 외 에 도 QProcess 는 정적 구성원 함수 도 사용 할 수 있 습 니 다.
  • QProcess::execute()프로 세 스 를 시작 한 다음 프로 세 스 가 끝 날 때 까지 기 다 립 니 다.
  • QProcess::startDetached()프로 세 스 를 시작 한 다음 현재 프로 세 스 와 부자 관 계 를 끊 습 니 다.

  • 그러나 이 두 가지 용법 은 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()는 유 닉 스에 서 고아 프로 세 스 를 만 들 었 습 니 다.
  • 현재 프로 세 스 P 아래 fork()에서 하위 프로 세 스 C1
  • 을 가 져 옵 니 다.
  • C1 하 fork()하위 프로 세 스 CC1
  • 가 져 오기
  • C1 자원 종료,CC1 execve 호출 외부 프로그램 실행 및 프로 세 스 P 와 관계 이탈
  • 유 닉 스에 서 는 시스템(),popen()등 라 이브 러 리 함수 도 외부 프로그램 을 시작 할 수 있 습 니 다.
    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 인자 와 대응 하 는 것):
  • PCTSTR pszApplicationName

  • 윈도 핵심 프로 그래 밍 에 따 르 면 99%의 경우 NULL 을 직접 전달 합 니 다.그것 이 존재 하 는 원래 목적 은 윈도 우즈 의 posix 서브 시스템 을 지원 하기 위 한 것 이다.
    이 인자 가 지정 되 어 있 으 면:프로그램 이름 접 두 사 를 지정 해 야 합 니 다.그리고 현재 작업 경로 에 없 으 면 모든 경 로 를 지정 해 야 합 니 다.
    주:Qt 가 WindowCE 에서 이 인 자 를 사용 하고 있 습 니 다.
  • PTSTR pszCommandLine

  • 이전 인자 가 NULL 이면 이 문자열 의 첫 번 째 빈 칸(작은 따옴표 로 묶 인 것 은 포함 되 지 않 음)앞의 내용 은 프로그램의 프로그램 이름 입 니 다.
    프로그램 이름 에 경 로 를 포함 하지 않 으 면 다음 순서대로 찾 습 니 다.
  • 현재 프로 세 스 의 프로그램 파일 이 있 는 디 렉 터 리
  • 현재 프로 세 스 의 작업 디 렉 터 리
  • Windows 시스템 32 디 렉 터 리
  • Windows 디 렉 터 리
  • 환경 변수 PATH 의 디 렉 터 리
  • 이것 은 문자열 입 니 다.유 닉 스에 서 는 문자열 의 목록 입 니 다.매개 변수 에 빈 칸 등 이 포함 되 어 있 을 때 Windows 에 서 는 항상 특별한 처리 가 필요 합 니 다.
  • PVOID pvEnvironment

  • 환경 변수
  • PCTSTR pszCurDir

  • 작업 디 렉 터 리 를 지정 합 니 다.이것 은 앞에서 언급 하지 않 았 습 니 다.유 닉 스에 서 는 fork()/execve()두 단계 로 나 뉘 어 fork()이후 chdir 설정 프로 세 스 의 작업 디 렉 터 리 를 직접 호출 하면 됩 니 다.
    마찬가지 로 QProcess::startDetached()의 상황 을 살 펴 보 자.
     
    BOOL bInheritHandles
     
    QProcess::startDetached()
    FALSE
    부모 프로 세 스 CreateProcess 후 즉시 CloseHandle 을 호출 하여 가지 고 있 는 하위 프로 세 스 의 스 레 드 와 프로 세 스 핸들 을 닫 습 니 다.
    QProcess::start()
    TRUE
     
    프로 세 스 종료
    시작 을 보고 종료(termination)를 간단히 봅 니 다.
    C1X 와 C++11 기준 이전에 C/C+기준 에는 스 레 드 와 관련 된 것 이 없습니다. 。따라서 프로 세 스 종료 와 관련 된 함수 가 간단 합 니 다:
  • main 함수 중의 return
  • exit()
  • _Exit()
  • abort()

  • 앞으로 도 다 중 스 레 드 상황 은 고려 하지 않 겠 습 니 다.이렇게 되면 간단하게 생각 하기 만 하면 된다.
  • 프로 세 스 자원 종료
  • 다른 프로 세 스 가 이 프로 세 스 의 끝 을 요구 합 니 다
  • 자원 해서 끝 난 우 리 는 일반적으로 관심 이 없 기 때문에 하나만 뒤에 있 을 수 밖 에 없다.QProcess 에 서 는 다음 과 같이 대응 합 니 다.
  • QProcess::kill()
  • QProcess::terminate()
  • QProcess::close()

  • 그 중 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()는 다른 것 을 사용 합 니 다.
  • EnumWindows()매 거 진 프로 세 스 의 최상 위 창
  • 을 사용 합 니 다.
  • 각 창 에 PostMessage()를 사용 하여 WM 보 내기닫 기 메시지
  • PostThreadMessage()를 사용 하여 메 인 스 레 드 에 WM 보 내기닫 기 메시지
  • 좋은 웹페이지 즐겨찾기