// Ein spezielles Neuron mit genau einer Aufgabe #include #include #include #include #define STARTSIG SIGUSR1 // nach Erhalt des Signals wird die // Konfigdatei gelesen #define MAXNR 100 // max. Anzahl Neuronen #define SIGNR (SIGRTMAX-SIGRTMIN+1) int weight[100]; // Gewichtungen aller Eingangsleitungen int outneuron[MAXNR]; // Ausgangsleitung zu einem Neuron int outsig[MAXNR]; // Zuordnung Signalnr/Leitung int map[MAXNR]; // PIDs der aktiven Neuronen int nmap, nout; // Anzahl verwendeter Neuronen/Leitungen volatile int started = 0; volatile int counter = 0; int limit = 100; // Proz. wird beim Eintreffen eines Signals eines anderen Neurons aufgerufen // es muss die Gewichtung der jeweiligen Leitung berücksichtigt werden void handler (int sig) { counter += weight[sig-SIGRTMIN]; } // fängt das Startsignal vom Verwalter ab; started wird auf 1 gesetzt und // damit die Warteschleife im Hauptprg. verlassen void start_handler () { started = 1; } void usage () { fprintf (stderr, "Usage: neron config nr\n"); exit (1); } int main (int argc, char * argv[]) { struct sigaction act; int i, neuron, pid, arg1, arg2, nr; FILE * file; char line[100], key[100]; int NR; if (argc != 3) usage (); if (sscanf (argv[2], "%d", &NR) != 1) usage (); nout = 0, nmap = 0; for (i=0; i= MAXNR) || (neuron < 0)) { fprintf (stderr, "Parse Error: %s\n", line); exit (1); } map[neuron] = pid; continue; } if (sscanf (line, "%d %s %d %d", &nr, key, &arg1, &arg2) != 4) { fprintf (stderr, "Parse error %s\n", line); exit (1); } if (nr != NR) // KonfigZEile geht mich nix an! continue; if (strcasecmp (key, "in") == 0) { // IN if ((arg1 < 0) || (arg1 > SIGNR)) { fprintf (stderr, "Bad input\n"); exit (1); } weight[arg1] = arg2; // Gewichtung merken } else if (strcasecmp (key, "out") == 0) { // OUT if ((arg1 < 0) || (arg1 >= MAXNR) || (arg2 < 0) || (arg2 >= SIGNR)) { fprintf (stderr, "Bad input\n"); exit (1); } outneuron[nout] = arg1; // Zielneuron merken outsig[nout] = SIGRTMIN+arg2; nout++; } else { fprintf (stderr, "Parse Error %s\n", line); exit (1); } } /* Ready to go */ while (1) { // warten auf Signale anderer Neuronen if (counter >= limit) { // Eingangslimit erreicht counter = 0; // Ausgangssignale verschicken for (i=0; i