#include // pid_t #include // fork, execve #include // perror #include // exit #include // wait // Speicher fuer das neue Environment char newenvdata[2][12]; // Speicher fuer das neue argv char newargvdata[2][12]; int main(char *argv[], int argc) { // Array von Zeigern auf das neue Environment char *newenv[2]; // Array von Zeigern auf argv des Kinds char *newargv[2]; // Setze die Zeiger auf die richtigen Adressen des Speichers for(int i = 0; i<2; i++) { newenv[i] = (char*)&newenvdata[i]; newargv[i] = (char*)&newargvdata[i]; } // initialisiere "random seed" srand(time(0)); // generiere Zufallszahl int randomval = rand() % 256; // erzeuge neues Environment newenv[1] = 0; // NULL waere gleichwertig snprintf(newenv[0], 12, "EXITVAL=%d", randomval); // Erzeuge triviales argv newargv[1] = 0; newargv[0] = "envstatus"; pid_t p = fork(); if(p < 0) perror("fork"), exit(1); if(p > 0) { // Wir sind der Elternprozess int status; pid_t waitp = wait(&status); if(waitp < 0) perror("wait"), exit(2); if(waitp != p) printf("wait: Habe PID %d erhalten, aber %d erwartet!\n", waitp, p), exit(3); if(!WIFEXITED(status)) printf("wait: Kindprozess wurde nicht normal beendet!\n"), exit(4); int exitstatus = WEXITSTATUS(status); printf("Test %s mit Status %d\n", (exitstatus==randomval)?"erfolgreich":"fehlgeschlagen", exitstatus); exit(0); } else { // Wir sind der Kindprozess execve("./envstatus", newargv, newenv); perror("execve"); exit(255); } }