• 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

Object Storage Arubacloud
0 głosów
273 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 (194,920 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 (154,860 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 563 wizyt
0 głosów
2 odpowiedzi 184 wizyt
pytanie zadane 15 maja 2018 w C i C++ przez Q7V Gaduła (4,250 p.)
0 głosów
2 odpowiedzi 690 wizyt
pytanie zadane 12 listopada 2017 w C i C++ przez Gharte Nowicjusz (120 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...