#include <stdlib.h>
#include <stdio.h>
#include <sys/neutrino.h>
#include <errno.h>
#define PROGNAME "posix_server: "
int main(int argc, char *argv[]) {
mqd_t mq_des; // The message-queue descriptor, returned by mq_open()
struct mq_attr mq_stat; // Structure to store the attributes of the message queue
char *msg [ 512 ]; // A pointer to a buffer where the function can store the received data
// Open a message queue
if( (mq_des = mq_open("/serv_mq", O_RDONLY | O_CREAT, 0777, NULL)) == -1){
perror( PROGNAME "mq_open" );
exit( EXIT_FAILURE );
}
// Get a message queue's attributes
mq_getattr( mq_des, // The message-queue descriptor, returned by mq_open()
&mq_stat); // Structure to store the attributes of the message queue
while ( 1 ){
// Receive a message from a queue
if( mq_receive ( mq_des, // The ID of a channel that we established by calling ChannelCreate()
msg, // A pointer to a buffer where the function can store the received data
mq_stat.mq_msgsize, // The size of the buffer
NULL ) == -1 ){
perror( PROGNAME "mq_receive" );
exit( EXIT_FAILURE );
}
// printf ( "Receive message: = %s \n ", msg );
}
mq_close(mq_des);
mq_unlink("/serv_mq");
return EXIT_SUCCESS;
}
Результаты:
# ./server&
[1] 700462
# ./client
Receive message: = HELLO! IT IS CLIENT
Message send
#
В результате выполнения программы сервер получил сообщение от клиента.
VI. Семафоры и разделяемая память
Последовательность действий:
- откомпилировать программы (gcc -o server server.c; gcc -o client client.c)
- запустить на выполнение исполняемый модуль ./server
- запустить на выполнение исполняемый модуль ./client
Сервер ожидает начала работы клиента, после чего ждет освобождения разделяемой
памяти, блокирует ее и читает сообщение. Затем сервер пишет сообщение в
разделяемую память и освобождает ресурс.
Файл Server.с
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <semaphore.h>
#include <sys/mman.h>
#define MAXBUFF 80
#define PERM 0666
typedef struct mem{
int segment;
char buff[MAXBUFF];
} message;
int fd, val_wait;
message* msgptr;
sem_t sem;
int main () {
char *name_shm = "sh_name";
char *path_shm = "/sh_name";
sem_close (&sem);
shm_unlink (path_shm);
fd = shm_open (name_shm, O_RDWR | O_CREAT, 0666);
ftruncate (fd, sizeof(*msgptr));
msgptr = mmap (0, sizeof (*msgptr), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
sem = *sem_open(path_shm, O_CREAT , S_IRWXG, 0);
if ((int) & sem == -1) {
printf ("Error: can't use sem_open");
return -1;
}
while (1) {
val_wait = sem_wait (&sem);
printf ("Server: read message: %s", msgptr->buff);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.