• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

GetExitCodeProcess() zwraca wartości których nie rozumiem

0 głosów
442 wizyt
pytanie zadane 11 grudnia 2020 w C i C++ przez komboboost0 Użytkownik (570 p.)

Cześć. Tak jak w temacie - nie potrafię poprawnie wyświetlić wartości które chcę dostać z GetExitCodeProcess(). Po uruchomieniu programu z argumentem 5, w ostatniej kolumnie powinny być to cyfry od 1 do 5:

 

 

 

 

 

 

 

 

 

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) {
STARTUPINFO si;
    PROCESS_INFORMATION pi1;
	PROCESS_INFORMATION pi2;
	char argline[20];
    memset(&si, 0, sizeof(si));
    memset(&pi1, 0, sizeof(pi1));
    memset(&pi2, 0, sizeof(pi2));
	unsigned int currentID = GetCurrentProcessId();
	unsigned int child2ID;
	unsigned int child1ID;
    si.cb = sizeof(si);
	int pass1 = d - 1;
	int pass2 = d - 2;
    sprintf(argline, "lab09.exe %d", pass1);
    if (CreateProcessA(NULL, argline, NULL, NULL, 0, 0, NULL, NULL, &si, &pi1) == 0) {
		fprintf(stderr, "wywolanie procesu 1 niepowiodlo sie");
    }else{
		child1ID = GetProcessId(pi1.hProcess);
	}
    sprintf(argline, "lab09.exe %d", pass2);
    if (CreateProcessA(
					NULL,		//lpApplicationName
					argline,	//lpCommandLine
					NULL,		//lpProcessAttributes
					NULL,		//lpThreadAttributes
					0,			//bInheritHandles
					0,			//dwCreationFlags
					NULL, 		//lpEnvironment
					NULL, 		//lpCurrentDirectory
					&si, 		//lpStartupInfo
					&pi2		//lpProcessInformation
					) == 0) {
		fprintf(stderr, "wywolanie procesu 2 niepowiodlo sie");
    }else{
		child2ID = GetProcessId(pi2.hProcess);
	}
	
	DWORD exit1;
	GetExitCodeProcess(pi1.hProcess, &exit1);
	DWORD exit2;
	GetExitCodeProcess(pi2.hProcess, &exit2);
	
    WaitForSingleObject(pi1.hProcess, INFINITE);
    CloseHandle(pi1.hProcess);
    CloseHandle(pi1.hThread);

    WaitForSingleObject(pi2.hProcess, INFINITE);
    CloseHandle(pi2.hProcess);
    CloseHandle(pi2.hThread);

	fprintf(stdout, "\n%d\t%d\t%d\t%d", currentID, child1ID, pass1, exit1);
	fprintf(stdout, "\n%d\t%d\t%d\t%d", currentID, child2ID, pass2, exit2);
	fprintf(stdout, "\n%d\t\t\t%d\n", currentID, exit1+exit2);

	exit(exit1+exit2);
}

 

komentarz 12 grudnia 2020 przez j23 Mędrzec (195,220 p.)

exit(exit1+exit2);

Po co to? Nie wystarczy po prostu return exit1 + exit2; ?

1 odpowiedź

+1 głos
odpowiedź 11 grudnia 2020 przez tangarr Mędrzec (155,140 p.)
wybrane 12 grudnia 2020 przez komboboost0
 
Najlepsza

Oj. Nie doczytałeś dokumentacji!
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getexitcodeprocess

Important  The GetExitCodeProcess function returns a valid error code defined by the application only after the thread terminates. Therefore, an application should not use STILL_ACTIVE (259) as an error code. If a thread returns STILL_ACTIVE (259) as an error code, applications that test for this value could interpret it to mean that the thread is still running and continue to test for the completion of the thread after the thread has terminated, which could put the application into an infinite loop.

komentarz 12 grudnia 2020 przez komboboost0 Użytkownik (570 p.)
[...]
    DWORD exit1;
	GetExitCodeProcess(pi1.hProcess, &exit1);
	DWORD exit2;
	GetExitCodeProcess(pi2.hProcess, &exit2);
	
    WaitForSingleObject(pi1.hProcess, INFINITE);
    WaitForSingleObject(pi2.hProcess, INFINITE);
	
	if (GetExitCodeProcess(pi1.hProcess, &exit1) == FALSE){
		fprintf(stderr, "GetExitCodeProcess() zwrocil blad\n");
	}else{
        fprintf(stdout, "\n%d\t%d\t%d\t%d", currentID, child1ID, pass1, exit1);
	}	
	if (GetExitCodeProcess(pi2.hProcess, &exit2) == FALSE){
		fprintf(stderr, "GetExitCodeProcess() zwrocil blad\n");
	}else{
		fprintf(stdout, "\n%d\t%d\t%d\t%d", currentID, child2ID, pass2, exit2);
	}
	
	fprintf(stdout, "\n%d\t\t\t%d\n", currentID, exit1+exit2);
	
	CloseHandle(pi1.hProcess);
    CloseHandle(pi1.hThread);
	CloseHandle(pi2.hProcess);
    CloseHandle(pi2.hThread);

	return exit1+exit2;

Tak wygląda rozwiązanie mojego problemu, może komuś kiedyś się przyda.

Podobne pytania

0 głosów
2 odpowiedzi 895 wizyt
0 głosów
2 odpowiedzi 358 wizyt
pytanie zadane 15 maja 2018 w C i C++ przez Q7V Gaduła (4,250 p.)
0 głosów
2 odpowiedzi 1,407 wizyt
pytanie zadane 12 listopada 2017 w C i C++ przez Gharte Nowicjusz (120 p.)

93,729 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,288 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...