From: jyke@cc.tut.fi (Jyke Jokinen)
Subject: Re: IPC sanomien avulla (vinkkeja kaivataan)
Reply-To: jyke@cc.tut.fi
Organization: Tampere University of Technology, Finland
Distribution: sfnet
Date: Thu, 30 Jul 92 15:31:32 GMT


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 -
Newsgroups: sfnet.atk.unix