home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / sfnet / atk / unix / 151 < prev    next >
Encoding:
Text File  |  1992-07-29  |  4.3 KB  |  145 lines

  1. Newsgroups: sfnet.atk.unix
  2. Path: sparky!uunet!mcsun!news.funet.fi!cc.tut.fi!jyke
  3. From: jyke@cc.tut.fi (Jyke Jokinen)
  4. Subject: Re: IPC sanomien avulla (vinkkeja kaivataan)
  5. Message-ID: <1992Jul30.153132.13903@cc.tut.fi>
  6. Sender: jyke@cc.tut.fi (Jokinen Jyke)
  7. Reply-To: jyke@cc.tut.fi
  8. Organization: Tampere University of Technology, Finland
  9. Distribution: sfnet
  10. Date: Thu, 30 Jul 92 15:31:32 GMT
  11. Lines: 131
  12.  
  13.  
  14. ppulkki@cs.joensuu.fi (Pekka Pulkkinen) writes:
  15.   Mistakahan kirjasta (sori, skandit puuttuu) loytyisi tietoa ja mielellaan
  16.   esimerkkiohjelmia, kuinka kaytetaan sanomajonoja IPC:n toteuttamiseen.
  17.   Yrittelin saada sanomia jonoon msgsnd-funktiolla, mutta pahalainen aina
  18.   valitti oikeuksien puuttumisesta (EACCES), vaikka suoritin kokeilua yhden
  19.   c-patkan sisalla. Lisaksi struct msgbuf:n kentta mtext on varsin outo - 
  20.   siis miten tieto oikein valitetaan sanomassa, pitaako allokoida itse 
  21.   sanomalle muistia vai? Jos jollakin on tietoa, niin jakoon vaan.
  22.  
  23. Oletus: Kaipaat tietoa System V Message Queue jarjestelmasta
  24.     (msgsnd & msgbuf viittausten perusteella).
  25.  
  26. Todella hyva kirja on:     UNIX Network Programming.
  27.             W. Richard Stevens
  28.             Prentice Hall Software Series.
  29.             ISBN 0-13-949876-1
  30.  
  31. Maksanut akateemisessa muutama vuosi sitten: 395,-
  32. Sisaltaa paljon asiaa otsikon mukaisesta aiheesta, mutta luvussa 3.9
  33. on esitelty tarkasti sanomajonojen (Message Queue) toimintaa.
  34.  
  35. msgbuf on malli tai 'pohja' siita minkalaista dataa sanomajono haluaa.
  36. Eli datan alussa on oltava tunniste (id) ja sen jalkeen sitten mita 
  37. tahansa. Tata 'mita tahansa' tavujoukkoa kuvaa se structin kentta 
  38. char mtext[1].
  39.  
  40. EACCES ongelma liittyy nimensa mukaisesti kayttooikeuksiin (oletko
  41. antanut esim. nollan oikeuksiksi kun luot jonon ?). Ilman koodin nakemista
  42. muut mahdolliset syyt on vain arvailua. Lisaksi 'yhden c-patkan sisalla'
  43. eli yhdessa prosessissa on minusta hieman hankala kokeilla viestin
  44. valittamista. Seuraava patka tekee ensin kaksi prosessia (fork) ja
  45. lahettaa sitten niiden valilla viestin. Ohjelma on kokeiltu SunOS4.1:lla.
  46.  
  47. ---------clipeti-clip--------------------------------------------------------
  48. /*
  49.     This program is free software; you can redistribute it and/or modify
  50.     it under the terms of the GNU General Public License as published by
  51.     the Free Software Foundation; either version 2 of the License, or
  52.     (at your option) any later version.
  53. */
  54. #include <stdio.h>
  55. #include <sys/types.h>
  56. #include <sys/ipc.h>
  57. #include <sys/msg.h>
  58.  
  59. /* 'todellisessa' sovelluksessa avain eli jonon tunniste
  60.    kannattaa rakentaa ftok() -funktion avulla: */
  61. #define KEY ((key_t) 424242L)
  62. #define PERMISSIONS 0666       /* kaikille luku/kirj */
  63.  
  64. /* Viestin tunnus ja oma viestipuskuri */
  65. #define ID 42L
  66. struct oma_msgbuf {
  67.   long mtype;
  68.   char viesti[ 1024 ];
  69. }
  70.  
  71. parent()
  72. {
  73.   int read_id;
  74.   struct oma_msgbuf rcv_message;
  75.  
  76.   printf("Parent running\n");
  77.   /* luodaan jarjestelmaan sanomajono */
  78.   read_id = msgget( KEY, PERMISSIONS | IPC_CREAT );
  79.   if( read_id < 0 ) {
  80.     perror("parent msgget");
  81.     exit( -1 );
  82.   }
  83.   
  84.   /* vastaanotetaan viesti */
  85.   msgrcv( read_id, &rcv_message, sizeof( rcv_message ), ID, 0 );
  86.   printf( "Viesti: %s\n", rcv_message.viesti );
  87.  
  88.   /* tuhotaan sanomajono jarjestelmasta */
  89.   if( msgctl( read_id, IPC_RMID, (struct msgid_ds *) 0 ) < 0 ) {
  90.     perror("parent: msgctl");
  91.     exit( -1 );
  92.   }
  93.  
  94.   exit( 0 );
  95. }
  96.  
  97. child()
  98. {
  99.   int write_id;
  100.   struct oma_msgbuf snd_message;
  101.  
  102.   /* odotetaan, etta isa-prosessi on ehtinyt luoda sanomajonon */
  103.   sleep( 5 );
  104.  
  105.   printf("Child running\n");
  106.   /* avataan sanomajono */
  107.   write_id = msgget( KEY, 0 );
  108.   if( write_id < 0 ) {
  109.     perror("child msgget");
  110.     exit( -1 );
  111.   }
  112.  
  113.   /* tehdaan viesti ja lahetetaan se */
  114.   snd_message.mtype = ID;
  115.   strcpy( snd_message.viesti, "'You're a jerk, Dent,' it said simply" );
  116.   msgsnd( write_id, &snd_message, sizeof( snd_message ), 0 );
  117.  
  118.   /* oma osuus tehty */
  119.   exit( 0 );
  120. }
  121.  
  122. main()
  123. {
  124.   int f = fork();
  125.   if( f < 0 ) {
  126.     perror("fork");
  127.     exit( -1 );
  128.   }
  129.  
  130.   if( f == 0 )
  131.     child();
  132.   else
  133.     parent();
  134. }
  135.  
  136. ---------clipeti-clip--------------------------------------------------------
  137.  
  138. --
  139.     *** Jyke ***
  140. -- 
  141. *** Jyke *** (jyke@cc.tut.fi)    | Three quarks for Muster Mark!               
  142. 42-42-42-42-42-42-42-42-42-42    | Sure he hasn't got much of a bark
  143. I Love Mankind,                  | And sure any he has it's all beside the mark
  144. It's the People I can't Stand    |     - James Joyce: Finnegan's Wake -
  145.