Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Программе в качестве единственного аргумента передается имя файла разделяемой библиотеки.
- //Программа должна создать именованный разделяемый сегмент памяти, и поместить в него структуру:
- //typedef struct {
- //sem_t request_ready; // начальное значение 0
- //sem_t response_ready; // начальное значение 0
- //char func_name[20];
- //double value;
- //double result;
- //} shared_data_t;
- //После инициализации структуры и готовности к взаимодействию - вывести на стандартный поток вывода имя разделяемого сегмента памяти POSIX для начала взаимодействия. При использовании высокоуровневых функций необходимо использовать fflush.
- //Взаимодействие заключается в выполнении некоторой функции с заданным именем func_name с единственным аргументом value и сохранением результата в result.
- //Когда противоположная сторона сформировала запрос, то разблокируется семафор request_ready. При готовности результата вычисления реализованной программой необходимо разблокировать семафор response_ready.
- //Признаком завершения взаимодействия считается пустое имя функции.
- //Используйте уникальные имена разделяемых сегментов памяти, например, используя в качестве части имени свой логин в ejudge.
- //Не забывайте удалять за собой используемые ресурсы.
- #include <semaphore.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <limits.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <sys/mman.h>
- #include <errno.h>
- #include <dlfcn.h>
- typedef struct {
- sem_t request_ready; // начальное значение 0
- sem_t response_ready; // начальное значение 0
- char func_name[20];
- double value;
- double result;
- } shared_data_t;
- char* itoa(int val, int base){
- static char buf[4] = {0};
- int i = 30;
- for(; val && i ; --i, val /= base)
- buf[i] = "0123456789abcdef"[val % base];
- return &buf[i+1];
- }
- int main(int argc, char* argv[]) {
- int random_number = rand()%1999;
- char buffer[4];
- char shared_memory[NAME_MAX];
- strncat(shared_memory, "/winsold_", 10);
- strncat(shared_memory, argv[2], sizeof(shared_memory));
- strncpy(buffer, itoa(random_number, 10), sizeof(buffer));
- strncat(shared_memory, buffer, 4);
- fflush(stdout);
- printf("%s", shared_memory);
- int shm_id = shm_open(shared_memory, O_RDWR|O_CREAT, 0);
- ftruncate(shm_id, sizeof(shared_data_t));
- shared_data_t* semaphoric_coop = mmap (NULL, sizeof(shared_data_t),
- PROT_READ|PROT_WRITE,
- MAP_SHARED,
- shm_id, 0);
- close(shm_id);
- while(sem_trywait(&semaphoric_coop->request_ready)){}
- sem_init(&semaphoric_coop->response_ready, 1, 0);
- while (strcmp(semaphoric_coop->func_name, "")) {
- sem_wait(&semaphoric_coop->response_ready);
- void *exec_func;
- double (*ret_func) (double);
- exec_func = dlopen(argv[1], RTLD_LAZY);
- if(!exec_func) {
- munmap(NULL, sizeof(shared_data_t));
- exit(1);
- }
- ret_func = dlsym(exec_func, semaphoric_coop->func_name);
- semaphoric_coop->result = (*ret_func)(semaphoric_coop->value);
- sem_post(&semaphoric_coop->response_ready);
- }
- sem_close(&semaphoric_coop->response_ready);
- sem_close(&semaphoric_coop->request_ready);
- munmap(NULL, sizeof(shared_data_t));
- shm_unlink(shared_memory);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement