/******************************************/ /* */ /* Prof. Dr. Carsten Vogt */ /* TH Koeln, Fakultaet IME */ /* http://www.nt.th-koeln.de/vogt */ /* */ /* UNIX-C-Schnittstelle: */ /* Prozesskommunikation ueber */ /* Mesage Queues. */ /* */ /******************************************/ #include #include #include #include #include #include #include int main() { /* Vaterprozess bereitet die Kommunikation vor */ int msgid; /* Identifikator der Message Queue */ int empf_id; /* PID des Empfaenger-Prozesses */ int i, status; /* Hilfsvariable */ /* Struct-Typ für die Nachrichten */ struct nachricht { long mtype; int wert1, wert2, wert3; }; /* Erzeugung der Message Queue */ msgid = msgget(IPC_PRIVATE,IPC_CREAT|0777); if (fork()==0) { struct nachricht message_snd; for (i=1;i<=5;i++) { /* Sender-Prozess sendet in Sekundenabständen fünf Dreiergruppen von int-Werten */ sleep(1); message_snd.mtype = 1; message_snd.wert1 = 10*i; message_snd.wert2 = 10*i+1; message_snd.wert3 = 10*i+2; printf("\nSender schreibt Typ = %ld, Wert1 = %d, Wert2 = %d, Wert3 = %d\n", message_snd.mtype, message_snd.wert1, message_snd.wert2, message_snd.wert3); msgsnd(msgid,&message_snd,sizeof(message_snd)-sizeof(long),0); } /* Sender-Prozess terminiert */ exit(0); } if ((empf_id=fork())==0) { /* Empfaenger-Prozess empfaengt beliebig viele Dreiergruppen von int-Werten */ struct nachricht message_rcv; while(1) { msgrcv(msgid,&message_rcv,sizeof(message_rcv)-sizeof(long),0,0); printf("\nEmpfaenger liest Typ = %ld, Wert1 = %d, Wert2 = %d, Wert3 = %d\n", message_rcv.mtype, message_rcv.wert1, message_rcv.wert2, message_rcv.wert3); } } /* Vater wartet auf Ende des Sender-Prozesses */ wait(&status); /* Vater terminiert den Empfaenger-Prozess, gibt im aber noch 1 Sekunde "Auslaufzeit" */ sleep(1); kill(empf_id,SIGKILL); /* Vater loescht die Message Queue */ msgctl(msgid,IPC_RMID,0); }