problem with IPCS on (FreeBSD 7.0-RELEASE-p5)

andrey artemyev freebsd at alive.net.ua
Sat Nov 22 17:50:52 PST 2008


FreeBSD 7.0-RELEASE-p5 amd64

Programming C/C++.
The down Queues (msgid = msgget ....) after message reception (msgrcv)

# ipcs
Message Queues:
T           ID          KEY MODE        OWNER    GROUP
q       327680         1174 --rw-rw-rw-     root    wheel
.....

Example:
msgserv.c
-------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <sys/errno.h>
#include "msgtypes.h"

int main(int argc, char * argv[])
{
   struct msg_t message;
   int msgid;
   char * response = "Ok!";
   msgid = msgget(KEY, 0666 | IPC_CREAT);
   msgrcv(msgid, &message, sizeof(message), 2, 0);
/*
   ATTENTION!!!
   After "msgrcv(msgid, &message, sizeof(message), 2, 0);" -
Queues(msgid) DOWN

   Helps only to create anew "msgid = msgget(KEY, 0666 | IPC_CREAT);"
*/
   printf("Client (pid = %i) sent: %s", message.snd_pid, message.body);
   message.mtype = 1;
   message.snd_pid = getpid();
   strcpy(message.body, response);

   msgsnd(msgid, &message, sizeof(message), 0);
// errno = 22 (bad msgid)
   msgrcv(msgid, &message, sizeof(message), 2, 0);
   msgctl(msgid, IPC_RMID, 0);
   return EXIT_SUCCESS;
}
-------------------

msgtypes.h
-------------------
#ifndef MSG_TYPES
#define MSG_TYPES

#define KEY 1174
#define MAXLEN 512

struct msg_t
{
    long mtype;
    int snd_pid;
    char body[MAXLEN];
};

#endif
-------------------

msgcli.c
-------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <strings.h>
#include "msgtypes.h"

int main(int argc, char * argv[])
{
   int msgid;
   int i;
   struct msg_t message;
   char buf[MAXLEN];
   msgid = msgget(KEY, 0666);
   if (msgid == -1)
   {
      printf("Server is not running!\n", msgid);
      return EXIT_FAILURE;
   }
   i = 0;
   while ( (i < (MAXLEN - 1)) && ((message.body[i++] = getchar()) !=
'\n') );
   message.body[i] = '\0';
   message.mtype = 2;
   message.snd_pid = getpid ();
   msgsnd(msgid, &message, sizeof(message), 0);
   msgrcv(msgid, &message, sizeof(message), 1, 0);
   printf("Server (pid= %i) responded: %s\n", message.snd_pid,
message.body);
   message.mtype = 2;
   msgsnd(msgid, &message, sizeof(message), 0);
   return EXIT_SUCCESS;
}
-------------------


Tested on FreeBSD 6.2 i386 - All has passed remarkably, errors were not




More information about the freebsd-questions mailing list