sprintf (msgptr->buff, "Message from server with PID = %d\n",
getpid ());
sem_post (&sem);
};
sem_close (&sem);
close (fd);
shm_unlink (name_shm);
return 0;
}
Файл Client.с
#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 180
#define PERM 0666
typedef struct mem{
int segment;
char buff[MAXBUFF];
} message;
message *msgptr;
sem_t sem;
int fd;
int main () {
char *name_shm = "sh_name";
char *path_shm = "/sh_name";
fd = shm_open (name_shm, O_RDWR , 0);
ftruncate (fd, sizeof (*msgptr));
msgptr = mmap (0, sizeof(*msgptr), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
sem = *sem_open (path_shm, O_EXCL, 0);
sprintf (msgptr->buff, "Message from client with PID = %d\n", getpid());
sem_post (&sem);
sem_wait (&sem);
printf ("Client: read message: %s", msgptr->buff);
close (fd);
shm_unlink (name_shm);
return 0;
}
Результаты:
#
# ./server&
[2] 753711
# ./client
Server: read message: Message from client with PID = 757808
Client: read message: Message from server with PID = 753711
В результате выполнения программы сообщения клиента и серверы были записаны в разделяемую память и прочитаны из нее корректно.
Выводы:
Ненадежные сигналы должны перезапускать обработчик внутри самого обработчика, если есть желание сохранить сигнал действующим. В случае надежных сигналов при отправке сигнала SIGINT в момент работы другого обработчика, блокирующего этот сигнал, по окончании работы этого обработчика запрос выполняется и процесс завершается.
Неименнованые каналы дают возможность обмена данными только между процессами-«родственниками», т.к. процесс может получить файловые дескрипторы для работы с неименнованнным каналом, только наследую их от родительского процесса.
Именованные каналы (FIFO) могут использоваться как средство взаимодействия между неродственными и даже удаленными процессами, хотя работают медленнее, чем неименованные.
Семафоры могут использоваться для обеспечения эксклюзивного доступа к ресурсам используемой машины. В данной работе было проведено исследование работы функций sem_open() sem_close() для создания и удаления именованных семафоров, для неименованных семафоров используются функции sem_init() и sem_destroy().
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.