POSIX Example: Sending messages between two processes

Example: Sending messages between two processes
The following two programs should be compiled and run at the same time to illustrate basic principle of message passing:
message_send.c
— Creates a message queue and sends one message to the queue.
message_rec.c
— Reads the message from the queue.
message_send.c — creating and sending to a simple message queue
The full code listing for message_send.c is as follows:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>

#define MSGSZ 128

/*
* Declare the message structure.
*/

typedef struct msgbuf {
long mtype;
char mtext[MSGSZ];
} message_buf;

main()
{
int msqid;
int msgflg = IPC_CREAT | 0666;
key_t key;
message_buf sbuf;
size_t buf_length;

/*
* Get the message queue id for the
* “name” 1234, which was created by
* the server.
*/
key = 1234;

(void) fprintf(stderr, “\nmsgget: Calling msgget(%#lx,\
%#o)\n”,
key, msgflg);

if ((msqid = msgget(key, msgflg )) < 0) {
perror(“msgget”);
exit(1);
}
else
(void) fprintf(stderr,”msgget: msgget succeeded: msqid = %d\n”, msqid);
/*
* We’ll send message type 1
*/

sbuf.mtype = 1;

(void) fprintf(stderr,”msgget: msgget succeeded: msqid = %d\n”, msqid);

(void) strcpy(sbuf.mtext, “Did you get this?”);

(void) fprintf(stderr,”msgget: msgget succeeded: msqid = %d\n”, msqid);

buf_length = strlen(sbuf.mtext) + 1 ;

/*
* Send a message.
*/
if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) {
printf (“%d, %d, %s, %d\n”, msqid, sbuf.mtype, sbuf.mtext, buf_length);
perror(“msgsnd”);
exit(1);
}

else
printf(“Message: \”%s\” Sent\n”, sbuf.mtext);

exit(0);
}
The essential points to note here are:
• The Message queue is created with a basic key and message flag msgflg = IPC_CREAT | 0666 — create queue and make it read and appendable by all.
• A message of type (sbuf.mtype) 1 is sent to the queue with the message Did you get this?
message_rec.c — receiving the above message
The full code listing for message_send.c’s companion process, message_rec.c is as follows:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>

#define MSGSZ 128

/*
* Declare the message structure.
*/

typedef struct msgbuf {
long mtype;
char mtext[MSGSZ];
} message_buf;
main()
{
int msqid;
key_t key;
message_buf rbuf;

/*
* Get the message queue id for the
* “name” 1234, which was created by
* the server.
*/
key = 1234;

if ((msqid = msgget(key, 0666)) < 0) {
perror(“msgget”);
exit(1);
}
/*
* Receive an answer of message type 1.
*/
if (msgrcv(msqid, &rbuf, MSGSZ, 1, 0) < 0) {
perror(“msgrcv”);
exit(1);
}

/*
* Print the answer.
*/
printf(“%s\n”, rbuf.mtext);
exit(0);
}
The essential points to note here are:
• The Message queue is opened with msgget (message flag 0666) and the same key as message_send.c.
• A message of the same type 1 is received from the queue with the message Did you get this? stored in rbuf.mtext.

 

High Speed CAN Termination

For high-speed CAN, both ends of the pair of signal wires (CAN_H and CAN_L) must be terminated.
This is because communication flows both ways on the CAN bus.

CAN_L is pin 2 and CAN_H is pin 7 on the standard 9-pin D-SUB connector.can