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");
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.