Операционные системы реального времени. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер, страница 4

sem_destroy(&sem->put);

sem_destroy(&sem->get);

shm_unlink( "./mem" );

close( fd );

exit(0);

}

Client.c

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <errno.h>

#include <stdlib.h>

#include <unistd.h>

#include <limits.h>

#include <sys/mman.h>

#include "shm.h"

int fd;

semaphores *sem;

void int_exit();

int main (int argc, char* argv[]){

signal(SIGINT,int_exit);

char buffer[MAXBUFF];

message* msgptr;

int tmp;

/* Create memory object */

fd = shm_open("./mem", O_RDWR | O_CREAT, 0777 );

if( fd == -1 ){

printf("from server: %s\n",strerror( errno) );

return EXIT_FAILURE;

}

/* Map the memory object */

msgptr = mmap(0, sizeof(*msgptr), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

if (msgptr == MAP_FAILED) {

printf("mmap failed:%s\n", strerror(errno));

return EXIT_FAILURE;

}

printf("msgptr addr is %6.6X\n", msgptr);

printf("size of msgptr = %d\n\n",sizeof(*msgptr));

/* Map the semaphore object */

sem = mmap(0, sizeof(*sem), PROT_READ | PROT_WRITE, MAP_SHARED, fd, sizeof(*msgptr));

if (sem == MAP_FAILED) {

printf("mmap failed:%s\n", strerror(errno));

return EXIT_FAILURE;

}

printf("sem addr is %6.6X\n", sem);

printf("size of sem = %d\n\n",sizeof(*sem));

if(sem_getvalue(&sem->get, &tmp) < 0){

printf("sem_getvalue failed:%s\n", strerror(errno));

return EXIT_FAILURE;

}

else

printf("sem->get \tvalue = %d\n", tmp);

if(sem_getvalue(&sem->put, &tmp) < 0){

printf("sem_getvalue failed:%s\n", strerror(errno));

return EXIT_FAILURE;

}

else

printf("sem->put \tvalue = %d\n", tmp);

while(1){      

if( gets( buffer ) != NULL ){

sem_wait(&sem->put);

sprintf(msgptr->buff,"from %d: %s",getpid(),buffer);

}

sem_post(&sem->get);

}

close( fd );   

}

void int_exit(){

int tmp;

close( fd );

exit(0);

}

Shm.h

#include <semaphore.h>

#define MAXBUFF 80

typedef struct {

int segment;

char buff[MAXBUFF];

} message;

typedef struct {

sem_t get;

sem_t put;

} semaphores;
2. IPC микроядра, на примере QNXNeutrino:

2.1. Сообщения.

2.1.1. Родственные процессы.

// ПРОГРАММА ДЛЯ РЕАЛИЗАЦИИ ПЕРЕДАЧИ СООБЩЕНИЙ МЕЖДУ РОДСТВЕННЫМИ ПРОЦЕССАМИ

#include <stdlib.h>

#include <stdio.h>

#include <process.h>

#include <errno.h>

#include <sys/neutrino.h>

int main(int argc, char *argv[]) {

int chid;         // ID КАНАЛА

int rcvid;        // КОМУ ОТВЕЧАТЬ

// СОЗДАЁМ НЕИМЕНОВАННЫЙ КАНАЛ

chid=ChannelCreate(0);

/* ПРОЦЕСС-РЕБЁНОК ОТПРАВЛЯЕТ СООБЩЕНИЕ И ВЫВОДИТ ОТВЕТ НА ЭКРАН*/

if (fork()==0){

// БУФЕРЫ ДЛЯ ОТПРАВЛЯЕМОГО СООБЩЕНИЯ И ОТВЕТА

char sendbuf[64];

char replybuf[64];

// ИДЕНТИФИКАТОР СОЕДИНЕНИЯ

int coid;

printf("THIS MESSAGE POSTED SON\n");

// ОТКРЫВАЕМ КАНАЛ

coid=ConnectAttach( 0, getppid(), chid, 0, 0 );

if (coid > 0){

// тЕКСТ СООБЩЕНИЯ

strcpy(sendbuf,"Hello!!! This message from child!\n");

MsgSend(coid, sendbuf, sizeof(sendbuf),replybuf,sizeof(replybuf) );

printf("This is reply from father: \"%s\"\n",&replybuf);

}

else {

printf("ERROR: ConnectAttach failed\n");

return EXIT_FAILURE;

}

}

else{

// ПРОЦЕСС-ОТЕЦ ПРИНИМАЕТ СООБЩЕНИЕ И ОТПРАВЛЯЕТ ОТВЕТ

// БУФЕРЫ

char receivebuf[64];

char replybuf[64];

printf("FATHER STARTED!\n");

rcvid = MsgReceive(chid,receivebuf,sizeof(receivebuf),NULL);

if (rcvid > 0){

printf("FATHER RECEIVED MESSAGE: \"%s\"\n",&receivebuf);

strcpy(replybuf,"Hello, Son. I received your message!\n");

MsgReply(rcvid,EOK,replybuf,sizeof(replybuf));

}

else{

printf("ERROR: MsgReceive failed\n");