007
23.11.2004, 18:05 Uhr
mike
Pinguinhüpfer (Operator)
|
Leider kennt er weder truce noch ptrace Ich hab das jetzt mit times versucht und habe nun das Problem des Jahrhunderts
C++: |
#include <stdio.h> #include <time.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/times.h> #include <unistd.h>
#define CHILDS 10
#define CHILD_KILLED 1 #define CHILD_ALIVE 2 #define CHILD_UDEF 3
typedef struct { pid_t pid; int status; clock_t tmstart; } chld_t;
time_t today; chld_t chld[10];
int exit_status(int status) { if(WIFEXITED(status)) printf("--> Normal Termination; exit-status=%d\n", WEXITSTATUS(status)); else if(WIFSIGNALED(status)) printf("--> Abnormal Termination; Signalnumber=%d\n", WTERMSIG(status)); }
void init(void) { int i; puts("Initialize Array ..."); for(i=0; i<CHILDS; i++) { chld[i].pid = -1; chld[i].status = CHILD_UDEF; } } void scheduler(void) { puts("Scheduler started ..."); double clk; if((clk = sysconf(CLK_TCK)) < 0) fprintf(stderr, "error sysconf");
int i; struct tms tmp; while(1) { for(i=0; i<CHILDS; i++) { printf("-----> %d %6.2f secs\n", chld[i].pid, (times(&tmp)-chld[i].tmstart)/clk); } sleep(0.5); } }
/***** CHILDS ******/ pid_t dirty(void) { pid_t pid; time(&today); if((pid=fork()) < 0) fprintf(stderr, "error: fork"); else if(pid == 0) { printf("%d started - class dirty - %s", getpid(), ctime(&today)); while(1); /* waste cpu time*/ exit(0); /* never reached */ }
return pid; }
pid_t goodone(void) { pid_t pid; time(&today); if((pid=fork()) < 0) fprintf(stderr, "error: fork"); else if(pid == 0) { printf("%d started - class good - %s", getpid(), ctime(&today)); sleep(3); exit(0); /* sleeping for 3secs and exit */ } return pid; }
/*******************/
int main(void) { srand(time(NULL)); int i,j;
pid_t sch; if((sch=fork()) < 0) fprintf(stderr,"Scheduler error"); else if(sch == 0) { init(); scheduler(); }
pid_t pid[CHILDS], pid_end[CHILDS]; struct tms tmp; for(i=0; i<CHILDS; i++) { if(rand()%2) pid[i]=dirty(); else pid[i]=goodone();
chld[i].pid = pid[i]; chld[i].status = CHILD_ALIVE; chld[i].tmstart = times(&tmp); sleep(rand()%3); /* sleep for 0,1 or 2 seconds*/ }
int status; for(i=1; i<=CHILDS; i++) { pid_end[i] = wait(&status); exit_status(status); } puts("I have been waiting for all processes ...");
for(i=1; i<=CHILDS; i++) for(j=1; j<=CHILDS; j++) if(pid_end[i] == pid[j]) printf("child %d ends normal\n");
if(waitpid(sch, NULL, 0) == -1) fprintf(stderr, "Wait Scheduler error");
exit(0); }
|
Die Funktion void scheduler(void) - Zeitberechnung - kann natürlich nicht funtzen, weil das Kind ja wieder ein eigenes Array im Speicher erzeugt. Weißt du zufällig wie ich das Array des Parent nutzen kann? Muss man das was mit dem IPC machen?
Mein Programm: Mein Programm hat 2 Funktionen goodone(void) und dirty(void). Die Funktionen werden nach Zufall zu unterschiedlichen Zeiten erzeugt. Die Aufgabe wäre es nun, allen Programmen die länger als 5sec laufen (alle dirty Funktionen) ein Quit Signal zu schicken - das soll scheduler(void) machen.
Danke, mfg michael --
Dieser Post wurde am 23.11.2004 um 18:09 Uhr von mike editiert. |