int main() { pid_t k, pid; int p, status, q; k = fork(); if (k != 0) { /* falls <> 0 --> THEN Eltern*/ /* Eltern mit k= Prozessnummer des Kindes*/ for (p=0; p<20; p++) { printf("\t\t\tElternteil %d, Kind=%d\n",p,k); warten(); } //pid=wait(&status); printf("\t\t\tIst Kindprozess beendet? PID war, %d\n",pid); //while(1); /*auf Abbruch durch <CTRL/C> warten*/ } else { /* Kind mit k=0 */ printf("Kindprozessnummer= %d \n", getpid()); for (p=0; p<10; p++) { printf ("Kind %d,%d\n",p,k); warten(); } exit(1); } }
/* * workAS() * Schnittstelle nur fuer das Modul Betriebsmittelverwaltung. Die * Schnittstelle dient dem Auslesen von maximal vier Meldungen der Module aus * dem Ringpuffer und deren Versendung ueber den I2C-Bus. * Fuer diese Uebertragung werden werden maximal 29 Bytes + Start- und * Stoppbits versendet. * * Nach Aufruf dieser Schnittstelle wird ueberprueft, ob der Ringpuffer leer * ist. Wenn dem so ist, muessen keine Daten untersucht werden und der Vorgang * wird beendet. * Andernfalls wird ueberprueft, ob der Lesezeiger AS_read_next_msg auf einen * gueltigen Index zeigt. Ggf. wird dieser durch Nullsetzen korrigiert. * Dadurch soll sichergestellt werden, dass im Folgenden nicht wahllose Werte * aus dem Speicher gelesen werden. * Es wird eine Wartepause von 1,568 ms eingelegt. * Dann wird versucht die I2C-Bus-Verbindung zum AD herzustellen. Dazu wird die * Funktion I2CSendAddr(addr, rd) mit den Parametern (8, WRITE) benutzt. * Schlaegt die Verbindung fehl, wird der Vorgang beendet. * Danach wird versucht maximal vier Meldungen zu versenden. Dazu werden * jeweils die naechsten 7 Daten aus dem Ringpuffer an der Stelle des * Lesezeigers AS_read_next_msg gelesen und mit Hilfe der Funktion * I2CSendByte(bt) wird sucht, sie zu versenden. Schlaegt die Verbindung fehl, * wird erst versucht die Verbindung zu beenden und danach wird der Vorgang * beendet. * Ist der Vorgang des Daten aus dem Ringpuffers versenden abgeschlossen, wird * versucht die Verbindung zu beenden. Dazu wird die Funktion I2CSendStop() * benutzt. * * Rueckgabe: Keine * * Autor: Felix Blueml */ void workAS() { // Maximale Anzahl Mitteilungen, die versendet werden. // byte maxSendMsg_workAS; // ist globale Variable // Zaehler fuer die beiden for-Schleifen, fuer die Versendung von // Mitteilungen. // byte i_workAS, j_workAS; // sind globale Variablen // Keine Elemente im Puffer zum versenden? if(!AS_msg_counter) { // Abbruch! return; } // Enthaellt AS_read_next_msg einen falschen Wert? if(AS_read_next_msg >= MAX_MELDUNGEN) { // Sicherstellen, dass nicht wahllos irgendwelche Werte aus // dem Speicher gelesen werden AS_read_next_msg = 0; } warten(); // eine Wartepause einlegen // Versuche eine schreibende Verbindung zum Arduino mit der // Adresse 4 herzustellen _i2c_error = 255; // Status: Kein Fehler I2CSendAddr(8, WRITE); if(_i2c_error != 255) // Fehler erkannt? { // Abbruch! return; } // Lese maximal 4 Mitteilungen aus dem Ringpuffer und versende sie if(AS_msg_counter<4) { maxSendMsg_workAS = AS_msg_counter; } else { maxSendMsg_workAS = 4; } for(i_workAS=0; i_workAS<maxSendMsg_workAS; i_workAS++) { for(j_workAS=0; j_workAS<7; j_workAS++) { // Versuche ein Byte aus dem Ringpuffer an den Arduino // zu versenden _i2c_error = 255; // Status: Kein Fehler I2CSendByte(AS_msg_array[AS_read_next_msg][j_workAS]); if(_i2c_error != 255) // Fehler erkannt? { // Versuche die Verbindung zu beenden I2CSendStop(); // Abbruch! return; } } // Eine komplette Statusmeldung wurde versendet, // Lesezeiger auf die naechste zu sendende Meldung setzen AS_read_next_msg = (AS_read_next_msg+1) % MAX_MELDUNGEN; // Fuellstand um 1 verringern AS_msg_counter--; } // Versuche die Verbindung zu beenden I2CSendStop(); }