home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: sfnet.atk.unix
- Path: sparky!uunet!mcsun!news.funet.fi!cc.tut.fi!jyke
- From: jyke@cc.tut.fi (Jyke Jokinen)
- Subject: Re: IPC sanomien avulla (vinkkeja kaivataan)
- Message-ID: <1992Jul30.153132.13903@cc.tut.fi>
- Sender: jyke@cc.tut.fi (Jokinen Jyke)
- Reply-To: jyke@cc.tut.fi
- Organization: Tampere University of Technology, Finland
- Distribution: sfnet
- Date: Thu, 30 Jul 92 15:31:32 GMT
- Lines: 131
-
-
- ppulkki@cs.joensuu.fi (Pekka Pulkkinen) writes:
- Mistakahan kirjasta (sori, skandit puuttuu) loytyisi tietoa ja mielellaan
- esimerkkiohjelmia, kuinka kaytetaan sanomajonoja IPC:n toteuttamiseen.
- Yrittelin saada sanomia jonoon msgsnd-funktiolla, mutta pahalainen aina
- valitti oikeuksien puuttumisesta (EACCES), vaikka suoritin kokeilua yhden
- c-patkan sisalla. Lisaksi struct msgbuf:n kentta mtext on varsin outo -
- siis miten tieto oikein valitetaan sanomassa, pitaako allokoida itse
- sanomalle muistia vai? Jos jollakin on tietoa, niin jakoon vaan.
-
- Oletus: Kaipaat tietoa System V Message Queue jarjestelmasta
- (msgsnd & msgbuf viittausten perusteella).
-
- Todella hyva kirja on: UNIX Network Programming.
- W. Richard Stevens
- Prentice Hall Software Series.
- ISBN 0-13-949876-1
-
- Maksanut akateemisessa muutama vuosi sitten: 395,-
- Sisaltaa paljon asiaa otsikon mukaisesta aiheesta, mutta luvussa 3.9
- on esitelty tarkasti sanomajonojen (Message Queue) toimintaa.
-
- msgbuf on malli tai 'pohja' siita minkalaista dataa sanomajono haluaa.
- Eli datan alussa on oltava tunniste (id) ja sen jalkeen sitten mita
- tahansa. Tata 'mita tahansa' tavujoukkoa kuvaa se structin kentta
- char mtext[1].
-
- EACCES ongelma liittyy nimensa mukaisesti kayttooikeuksiin (oletko
- antanut esim. nollan oikeuksiksi kun luot jonon ?). Ilman koodin nakemista
- muut mahdolliset syyt on vain arvailua. Lisaksi 'yhden c-patkan sisalla'
- eli yhdessa prosessissa on minusta hieman hankala kokeilla viestin
- valittamista. Seuraava patka tekee ensin kaksi prosessia (fork) ja
- lahettaa sitten niiden valilla viestin. Ohjelma on kokeiltu SunOS4.1:lla.
-
- ---------clipeti-clip--------------------------------------------------------
- /*
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- */
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
-
- /* 'todellisessa' sovelluksessa avain eli jonon tunniste
- kannattaa rakentaa ftok() -funktion avulla: */
- #define KEY ((key_t) 424242L)
- #define PERMISSIONS 0666 /* kaikille luku/kirj */
-
- /* Viestin tunnus ja oma viestipuskuri */
- #define ID 42L
- struct oma_msgbuf {
- long mtype;
- char viesti[ 1024 ];
- }
-
- parent()
- {
- int read_id;
- struct oma_msgbuf rcv_message;
-
- printf("Parent running\n");
- /* luodaan jarjestelmaan sanomajono */
- read_id = msgget( KEY, PERMISSIONS | IPC_CREAT );
- if( read_id < 0 ) {
- perror("parent msgget");
- exit( -1 );
- }
-
- /* vastaanotetaan viesti */
- msgrcv( read_id, &rcv_message, sizeof( rcv_message ), ID, 0 );
- printf( "Viesti: %s\n", rcv_message.viesti );
-
- /* tuhotaan sanomajono jarjestelmasta */
- if( msgctl( read_id, IPC_RMID, (struct msgid_ds *) 0 ) < 0 ) {
- perror("parent: msgctl");
- exit( -1 );
- }
-
- exit( 0 );
- }
-
- child()
- {
- int write_id;
- struct oma_msgbuf snd_message;
-
- /* odotetaan, etta isa-prosessi on ehtinyt luoda sanomajonon */
- sleep( 5 );
-
- printf("Child running\n");
- /* avataan sanomajono */
- write_id = msgget( KEY, 0 );
- if( write_id < 0 ) {
- perror("child msgget");
- exit( -1 );
- }
-
- /* tehdaan viesti ja lahetetaan se */
- snd_message.mtype = ID;
- strcpy( snd_message.viesti, "'You're a jerk, Dent,' it said simply" );
- msgsnd( write_id, &snd_message, sizeof( snd_message ), 0 );
-
- /* oma osuus tehty */
- exit( 0 );
- }
-
- main()
- {
- int f = fork();
- if( f < 0 ) {
- perror("fork");
- exit( -1 );
- }
-
- if( f == 0 )
- child();
- else
- parent();
- }
-
- ---------clipeti-clip--------------------------------------------------------
-
- --
- *** Jyke ***
- --
- *** Jyke *** (jyke@cc.tut.fi) | Three quarks for Muster Mark!
- 42-42-42-42-42-42-42-42-42-42 | Sure he hasn't got much of a bark
- I Love Mankind, | And sure any he has it's all beside the mark
- It's the People I can't Stand | - James Joyce: Finnegan's Wake -
-