[comp.unix.questions] msgctl

wmark@wb3ffv.ampr.org (Mark Winsor) (10/05/90)

Does anyone have a fragment of code to show the use of msgctl(), msgget(), and
msgop(). I'm in need of these facilities but i'm just not clicking with the
manual descriptions.

Thanks

Mark S. Winsor
Systems Analyst
ProVAR, Inc.

cpcahil@virtech.uucp (Conor P. Cahill) (10/06/90)

In article <3708@wb3ffv.ampr.org> wmark@wb3ffv.ampr.org (Mark Winsor) writes:
>Does anyone have a fragment of code to show the use of msgctl(), msgget(), and
>msgop(). I'm in need of these facilities but i'm just not clicking with the
>manual descriptions.


Snippet that allocates the message queue:

	key = (key_t) 0;
	if( (env=getenv("TALK_MSGQ_KEY")) != (char *) 0)
	{
		key = (key_t) atoi(env);
	}
	if( key <= 0 )
	{
		key = (key_t) TALK_MSGQ_KEY;
	}
	talkmsgqid = msgget(key,MODE|IPC_CREAT);

	if( talkmsgqid == -1 )
	{
		fatal("Unable to allocate talker message queue.");
	}

Snippet that sends a message out that queue:

	/*
	 * recieved acks and naks are processed by the talker.
	 */
	optr.type = TY_TALK_ACK;
	optr.data[0] = pkt->type;
	optr.pknum = pkt->data[0];

	if( msgsnd(talkmsgqid,&optr,sizeof(optr),0) == -1 )
	{
		sprintf(buffer, "Failed %s, errno=%d",
			"to send message to talker", errno);
		logit(buffer);
	}


Snippet that receives a message from the same queue:

	alarm(alarmtime);
	rtn = msgrcv(talkmsgqid, &optr, sizeof(optr), 0,0);
	alarm(0);

	if( rtn == -1 )
	{
		if( ! timeout )
		{
			sprintf(outdata, "%s, errno = %d, %s",
				"Msgrcv() FAILED", errno,
				"- restarting...");
			logit(outdata);
			continue;
		}
		else
		{
			timeout = FALSE;
			continue;
		}
	}

And control snippet that removes the message queue:

	fprintf(stderr,"Shutting down...");

	msgctl(talkmsgqid,IPC_RMID);

-- 
Conor P. Cahill            (703)430-9247        Virtual Technologies, Inc.,
uunet!virtech!cpcahil                           46030 Manekin Plaza, Suite 160
                                                Sterling, VA 22170